I am having some trouble with the examples in Rescorla's _SSL and TLS:
Designing and Building Secure Systems_ book.  I feel like I am making
a minor mistake somewhere, but I'm just overlooking where.  I would
appreciate another set of eyes to tell me where I am going wrong.

First of all, the examples distributed with Chapter 8 of the book do
not work at this point.  I think this is because the certs expired
long ago:

  $ openssl x509 -in server.pem -noout -text
  Certificate:
      Data:
          Version: 3 (0x2)
          Serial Number: 268 (0x10c)
          Signature Algorithm: dsaWithSHA1
          Issuer: C=US, O=Claymore Systems, Inc., OU=Widgets Division,
  CN=PowerTier EJB CA
          Validity
              Not Before: Oct 12 22:07:33 1999 GMT
              Not After : Aug  1 22:07:33 2002 GMT
          Subject: C=US, O=Claymore Systems, Inc., OU=Widgets
  Division, CN=localhost
          Subject Public Key Info:
     [................]

     $

(etc...)

This isn't itself a problem, because of course anybody who serious
about this topic is going to want to ${obtain} their own certs.

The problem that I am running into involves generating my own certs.
Naturally, since I am just playing around at this point (and trying to
teach myself some interesting new things), I want to be my own CA.  I
am running into one or more problems in this area.

Basically, when I generate my own CA keys, CA cert, server keys, and
server cert, I see the following when I run the example from chapter 8
of the book:

  $ make test-setup

     [ more on this in a moment.... ]

  $ ./sserver 
  Couldn't read key file
  23745:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad 
decrypt:evp_enc.c:461:
  23745:error:0906A065:PEM routines:PEM_do_header:bad decrypt:pem_lib.c:425:
  23745:error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM 
lib:ssl_rsa.c:669:


This is the part that I am stuck on, and I'm not seeing my mistake
yet.

I'm attaching a Makefile to this email that will show you exactly how
I am creating my keys and my certs.  The things that I would like to
point out are: (1) I am using a vanilla copy of Rescorla's code here:
http://www.rtfm.com/sslbook/examples/c-examples.tar.gz (2) for the
sake of simplicity I have hardcoded the passphrase "secret"
everywhere, which goes along with Rescorla's C code (please correct me
if I am wrong....) (3) my code generates DSS/DH keys, just to go along
with EKR's actual C code and (4) I'm not doing anything with cert
serial numbers yet.

The Makefile is just something that I whipped together.  It depends on
having /dev/random and Expect available.  It should be very easy to
understand how I am generating the keys/certs here.  Type "make
test-setup" to generate the keys/certs.  Type "make test-clean" to
clean everything up.

I would appreciate it if somebody could point out where I am going
wrong.  Thanks!

--kevin


PS  Here are my additions to Rescorla's Makefile, in case the mailing
list software axes my attachment:

#########################################################################
#########################################################################
#########################################################################


.PHONY: test-clean test-setup create_dh_group create_random_data create_ca_cert 
create_server_keypair do_signing create_client_keypair


create_dh_group:
        @echo Creating DH group
        openssl dhparam -check -text -5 1024 -out dh1024.pem

create_random_data:
        @echo Generating some random data \(THIS TAKES SOME TIME\)
        # todo:  make this obtain more random data
        dd if=/dev/random of=random.pem count=1 bs=128

create_ca_cert:
        @echo Generate CA keypair
        # openssl genrsa -des3 -passout pass:secret -out ca_key.pem 2048
        #
        openssl dsaparam -out dsa_params 2048
        expect -c 'set timeout -1; \
                   spawn openssl gendsa -des3 -out ca_key.pem dsa_params ; \
                   expect "Enter PEM pass phrase" ; \
                   send -- "secret\r"; \
                   expect "Verifying - Enter PEM pass phrase" ; \
                   send -- "secret\r"; expect eof;'
        @echo
        @echo Generate public-key certificate for CA
        (echo US; echo NH; echo Grovers Corners; echo XYZ Corp ; \
         echo engineering ; echo Bob the Certificate Authority ; \
         echo [EMAIL PROTECTED] ) \
        | openssl req -new -key ca_key.pem -x509 -days 3 -out ca_cert.cer 
-passin pass:secret
        # cat ca_key.pem ca_cert.cer >root.pem
        cp ca_cert.cer root.pem

create_server_keypair:
        @echo Generate Server DSA keypair
        expect -c 'set timeout -1; \
                   spawn openssl gendsa -des3 -out server_key.pem dsa_params ;\
                   expect "Enter PEM pass phrase" ; \
                   send -- "secret\r"; \
                   expect "Verifying - Enter PEM pass phrase" ; \
                   send -- "secret\r" ; expect eof'

do_signing:
        #  NOTE:  I am using "localhost" here.
        @echo Generate Server Certificate Signing Request \(CSR\)
        (echo US; echo NH; echo Grovers Corners; echo XYZ Corp ; \
         echo engineering ; echo localhost ; \
         echo [EMAIL PROTECTED] ; echo secret ; \
         echo XYZ Corp) \
        | openssl req -new -key server_key.pem -out server_request.csr -passin 
pass:secret
        @echo
        @echo Have CA sign CSR
        openssl x509 -req -days 3 -in server_request.csr -CA ca_cert.cer -CAkey 
ca_key.pem -CAcreateserial -out server.cer -passin pass:secret
        @echo
        @echo Creat .pem file that example wants
        cat server_key.pem server.cer >server.pem

create_client_keypair:
        @echo Create Client RSA keypair
        # todo:  revisit this after I get the server working
        openssl genrsa -des3 -passout pass:secret -out client.pem 2048


test-clean:
        rm -f *.cer *.pem *.csr dhparam

test-setup: create_dh_group create_random_data create_ca_cert 
create_server_keypair do_signing create_client_keypair



-- 
GnuPG ID: B280F24E


OPENSSLDIR=/users/ekr/src/freebsd/openssl-0.9.4
CFLAGS=-g -I$(OPENSSLDIR)/include
LD=-L$(OPENSSLDIR) -lssl -lcrypto

OBJS=common.o

all: sclient sserver rclient mserver pclient

sclient: sclient.o client.o read_write.o $(OBJS)
        $(CC) sclient.o client.o read_write.o $(OBJS) -o sclient $(LD)

rclient: rclient.o client.o read_write.o $(OBJS)
        $(CC) rclient.o client.o read_write.o $(OBJS) -o rclient $(LD)

pclient: pclient.o client.o read_write.o $(OBJS)
        $(CC) pclient.o client.o read_write.o $(OBJS) -o pclient $(LD)

sserver: server.o sserver.o echo.o $(OBJS)
        $(CC) sserver.o server.o echo.o $(OBJS) -o sserver $(LD)

mserver: server.o mserver.o echo.o $(OBJS)
        $(CC) mserver.o server.o echo.o $(OBJS) -o mserver $(LD)


#########################################################################
#########################################################################
#########################################################################


.PHONY: test-clean test-setup create_dh_group create_random_data create_ca_cert 
create_server_keypair do_signing create_client_keypair


create_dh_group:
        @echo Creating DH group
        openssl dhparam -check -text -5 1024 -out dh1024.pem

create_random_data:
        @echo Generating some random data \(THIS TAKES SOME TIME\)
        # todo:  make this obtain more random data
        dd if=/dev/random of=random.pem count=1 bs=128

create_ca_cert:
        @echo Generate CA keypair
        # openssl genrsa -des3 -passout pass:secret -out ca_key.pem 2048
        #
        openssl dsaparam -out dsa_params 2048
        expect -c 'set timeout -1; \
                   spawn openssl gendsa -des3 -out ca_key.pem dsa_params ; \
                   expect "Enter PEM pass phrase" ; \
                   send -- "secret\r"; \
                   expect "Verifying - Enter PEM pass phrase" ; \
                   send -- "secret\r"; expect eof;'
        @echo
        @echo Generate public-key certificate for CA
        (echo US; echo NH; echo Grovers Corners; echo XYZ Corp ; \
         echo engineering ; echo Bob the Certificate Authority ; \
         echo [EMAIL PROTECTED] ) \
        | openssl req -new -key ca_key.pem -x509 -days 3 -out ca_cert.cer 
-passin pass:secret
        # cat ca_key.pem ca_cert.cer >root.pem
        cp ca_cert.cer root.pem

create_server_keypair:
        @echo Generate Server DSA keypair
        expect -c 'set timeout -1; \
                   spawn openssl gendsa -des3 -out server_key.pem dsa_params ;\
                   expect "Enter PEM pass phrase" ; \
                   send -- "secret\r"; \
                   expect "Verifying - Enter PEM pass phrase" ; \
                   send -- "secret\r" ; expect eof'

do_signing:
        #  NOTE:  I am using "localhost" here.
        @echo Generate Server Certificate Signing Request \(CSR\)
        (echo US; echo NH; echo Grovers Corners; echo XYZ Corp ; \
         echo engineering ; echo localhost ; \
         echo [EMAIL PROTECTED] ; echo secret ; \
         echo XYZ Corp) \
        | openssl req -new -key server_key.pem -out server_request.csr -passin 
pass:secret
        @echo
        @echo Have CA sign CSR
        openssl x509 -req -days 3 -in server_request.csr -CA ca_cert.cer -CAkey 
ca_key.pem -CAcreateserial -out server.cer -passin pass:secret
        @echo
        @echo Creat .pem file that example wants
        cat server_key.pem server.cer >server.pem

create_client_keypair:
        @echo Create Client RSA keypair
        # todo:  revisit this after I get the server working
        openssl genrsa -des3 -passout pass:secret -out client.pem 2048


test-clean:
        rm -f *.cer *.pem *.csr dhparam

test-setup: create_dh_group create_random_data create_ca_cert 
create_server_keypair do_signing create_client_keypair

Reply via email to