curl-users
ssluse.c
Date: Mon, 17 May 2004 19:24:04 +0200
In order to circumvent a bug in ancient versions of openssl e.g. 0.9.6b
here a slightly modified version of the patch to ssluse.c that I had
send this morning.
*** curl-7.12.0-20040517mod/lib/ssluse.c Mon May 17 19:11:13 2004
--- curl-7.12.0-20040517/lib/ssluse.c Thu May 13 17:19:02 2004
***************
*** 872,905 ****
if(matched)
/* an alternative name matched the server hostname */
! infof(data, "\t subjectAltName: %s matched\n", conn->host.dispname);
else {
! /* we have to look to the last occurence of a commonName in the
! distinguished one to get the most significant one. */
! int j,i=-1 ;
!
! /* The following is done because of a bug in 0.9.6b */
!
! unsigned char * nulstr = "";
! unsigned char * peer_CN = nulstr;
!
! X509_NAME *name = X509_get_subject_name(server_cert) ;
! if (name)
! while ((j=X509_NAME_get_index_by_NID(name,NID_commonName,i))>=0)
! i=j;
!
! /* we have the name entry and we will now convert this to a string
! that we can use for comparison. Doing this we support BMPstring,
! UTF8 etc. */
!
! if (i>=0) {
! j = ASN1_STRING_to_UTF8(&peer_CN,X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name,i))) ;
! }
!
! if (peer_CN == nulstr)
! peer_CN = NULL;
!
! if (!peer_CN) {
if(data->set.ssl.verifyhost > 1) {
failf(data,
"SSL: unable to obtain common name from peer certificate");
--- 872,884 ----
if(matched)
/* an alternative name matched the server hostname */
! infof(data, "\t subjectAltName: %s matched\n", conn->host.name);
else {
! bool obtain=FALSE;
! if(X509_NAME_get_text_by_NID(X509_get_subject_name(server_cert),
! NID_commonName,
! peer_CN,
! sizeof(peer_CN)) < 0) {
if(data->set.ssl.verifyhost > 1) {
failf(data,
"SSL: unable to obtain common name from peer certificate");
***************
*** 910,931 ****
output a note about the situation */
infof(data, "\t common name: WARNING couldn't obtain\n");
}
! } else if(!cert_hostcheck(peer_CN, conn->host.name)) {
! if(data->set.ssl.verifyhost > 1) {
! failf(data, "SSL: certificate subject name '%s' does not match "
! "target host name '%s'", peer_CN, conn->host.dispname);
! OPENSSL_free(peer_CN);
! return CURLE_SSL_PEER_CERTIFICATE ;
}
else
! infof(data, "\t common name: %s (does not match '%s')\n",
! peer_CN, conn->host.dispname);
! }
! else {
! infof(data, "\t common name: %s (matched)\n", peer_CN);
! OPENSSL_free(peer_CN);
}
! }
return CURLE_OK;
}
#endif
--- 889,914 ----
output a note about the situation */
infof(data, "\t common name: WARNING couldn't obtain\n");
}
! }
! else
! obtain = TRUE;
!
! if(obtain) {
! if(!cert_hostcheck(peer_CN, conn->host.name)) {
! if(data->set.ssl.verifyhost > 1) {
! failf(data, "SSL: certificate subject name '%s' does not match "
! "target host name '%s'", peer_CN, conn->host.name);
! return CURLE_SSL_PEER_CERTIFICATE;
! }
! else
! infof(data, "\t common name: %s (does not match '%s')\n",
! peer_CN, conn->host.name);
}
else
! infof(data, "\t common name: %s (matched)\n", peer_CN);
}
! }
!
return CURLE_OK;
}
#endif
Received on 2004-05-17