On Wed, Jan 22, 2003, Jaco Kroon wrote:

> Hallo all
> 
> I have a little problem atm where I have to sign certificates.  I have both
> the private key, and the ca certificate loaded as cacert and cakey
> respectively.  Here is the part of the code where I suspect
> things break.
> 
> /*
>  * Variables to be used:
>  * X509 *cacert; // contains CA certificate.
>  * EVP_PKEY *cakey; // contains CA private key.
>  */
>     X509 *usrcert = X509_new();
>     if(!usrcert)
>     {
>         log_ssl_errors("X509_new");
>         return ERROR_NULL;
>     }
> 
>     if(!X509_set_version(usrcert,USRCERTVERSION))
>     {
>         log_ssl_errors("X509_set_version");
>         return ERROR_SSL;
>     }
> 
>     if(!X509_set_issuer_name(usrcert,X509_get_subject_name(cacert)))
>     {
>         log_ssl_errors("X509_set_issuer_name/X509_get_subject_name");
>         return ERROR_SSL;
>     }
> 
>     X509_gmtime_adj(X509_get_notBefore(usrcert),0);
>     X509_gmtime_adj(X509_get_notAfter(usrcert),(long)60*60*24*TRIALPERIOD);
> 
>     X509_NAME *subject = X509_NAME_new();
>     if(!subject)
>     {
>         log_ssl_errors("X509_NAME_new");
>         return ERROR_NULL;
>     }
> 
>     if(
> 
> !X509_NAME_add_entry_by_NID(subject,NID_pkcs9_emailAddress,MBSTRING_ASC,(uns
> igned char*)email,-1,-1,0) ||
> 
> !X509_NAME_add_entry_by_NID(subject,NID_commonName,MBSTRING_ASC,(unsigned
> char*)uname,-1,-1,0)
>       )
>     {
>         log_ssl_errors("X509_NAME_add_entry_by_NID");
>         return ERROR_SSL;
>     }
> 
>     if(!X509_set_subject_name(usrcert,subject))
>     {
>         log_ssl_errors("X509_set_subject_name");
>         return ERROR_SSL;
>     }
>     X509_NAME_free(subject);
> 
>     if(!X509_set_pubkey(usrcert,pkey))
>     {
>         log_ssl_errors("X509_set_pubkey");
>         return ERROR_SSL;
>     }
> 
>     EVP_MD *dgst = USR_DGST();
>     res = X509_sign(usrcert,cakey,dgst);
> 
>  /*
>  * res now equals 128 - the size of the private rsa key.
>  */
> 
> I then go ahead and dump the certificate using X509_print and get
> Certificate:
>     Data:
>         Version: 1 (0x0)
>         Serial Number: 0 (0x0)
>         Signature Algorithm: sha1WithRSAEncryption
>         Issuer: C=ZA, ST=Gauteng, L=Pretoria, O=InterExcel, OU=BackupServer,
> [EMAIL PROTECTED]
>         Validity
>             Not Before: Jan 22 19:20:46 2003 GMT
>             Not After : Feb 21 19:20:46 2003 GMT
>         Subject: [EMAIL PROTECTED], CN=6feffc9edd8be3e8
>         Subject Public Key Info:
>             Public Key Algorithm: rsaEncryption
>             RSA Public Key: (1024 bit)
>                 Modulus (1024 bit):
>                     00:b9:d5:be:8b:1e:f2:9e:6c:4b:88:5a:84:23:c5:
>                     ec:3e:be:7c:97:1d:e4:c1:f8:c4:45:b5:a6:1e:45:
>                     b9:57:d2:84:36:21:ec:53:35:94:65:18:c9:f8:f5:
>                     ef:da:10:c1:25:14:04:fa:14:77:83:a7:8b:79:ac:
>                     d2:c7:51:f2:6f:8e:83:19:ba:20:8d:ed:96:24:fd:
>                     ad:e9:9c:68:78:92:76:64:c0:b9:54:08:2c:5c:6a:
>                     d0:70:15:75:4c:57:b6:9e:f9:68:b1:44:8e:2a:16:
>                     2e:90:85:73:63:30:43:21:28:f2:46:5d:f7:40:d5:
>                     8a:a5:72:a2:00:0d:f9:7c:d7
>                 Exponent: 65537 (0x10001)
>     Signature Algorithm: sha1WithRSAEncryption
>         4c:7b:eb:10:3b:70:7f:d6:96:67:96:2d:55:e6:ce:ab:48:ee:
>         cc:28:dc:81:9e:2a:b1:80:ac:e5:bf:84:e6:71:b7:56:dd:39:
>         41:2b:1d:fb:dc:8e:16:85:2a:f0:f7:96:6f:b1:c9:69:38:bc:
>         46:2e:13:cc:28:5e:95:72:81:81:f7:83:97:80:98:96:35:73:
>         c7:4e:3b:48:b9:99:60:ae:c8:8f:4f:57:74:73:fb:09:0c:19:
>         c5:00:37:71:40:1f:cb:2c:3e:11:c5:c8:88:a5:53:f7:d6:61:
>         e2:f6:76:e7:3b:d8:bb:35:9d:24:21:55:bd:fe:09:81:ee:6b:
>         70:bc
> 
> Which is what I want.  Except that when I perform the command "openssl
> verify -CAfile cacert.pem gencert.pem" I get the output:
> 
> error 7 at 0 depth lookup:certificate signature failure
> 
> And my own program gives more detail:
> 
> rsa routines::RSA_verify failed with error code 0x4077068 (bad signature).
> asn1 encoding routines::ASN1_verify failed with error code 0xd079006 (bad
> get asn1 object call).
> Certificate failed.
> 
> I output the X509 certificate using PEM_write_X509(stdout,usrcert) which I
> then pipe into a file.
> 

One problem is probably that you aren't setting the certificate serial number.
You will get the default of zero which will clash with the CA certificate
serial number. The issuer_name and serial number combination should be unique.

Steve.
--
Dr. Stephen Henson      [EMAIL PROTECTED]            
OpenSSL Project         http://www.openssl.org/~steve/
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to