Я сгенерировал сертификат с помощью openssl и поместил его на клиентский компьютер, но когда я пытаюсь подключиться к моему серверу с помощью этого сертификата, я упоминал об ошибке в строке темы с моего сервера.
Вот что я сделал.
1) Я провожу тестовое соединение с помощью openssl, чтобы узнать, какие имена CA для сертификатов клиента приемлемы для моего сервера, я отправляю эту команду со своей клиентской машины на свой сервер:
openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -prexit
и часть того, что я возвращаю, выглядит следующим образом:
Acceptable client certificate CA names
/C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/emailAddress=tdrake@mysite.com
/C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/emailAddress=tdrake@mysite.com
2) Вот что находится в файле конфигурации apache на сервере относительно аутентификации клиента SSL:
SSLCACertificatePath /etc/apache2/certs
SSLVerifyClient require
SSLVerifyDepth 10
3) Я сгенерировал самозаверяющий сертификат клиента с именем «client.pem», используя mypos.pem и mypos.key, поэтому, когда я запускаю эту команду:
openssl x509 -in client.pem -noout -issuer -subject -serial
вот что возвращается:
issuer= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/emailAddress=tdrake@mysite.com
subject= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=mlR::mlR/emailAddress=admin@inteliware.com
serial=0E
(обратите внимание, что mypos.pem находится в / etc / apache2 / certs /, а mypos.key сохраняется в / etc / apache2 / certs / private /)
4) Я помещаю client.pem на клиентскую машину, а на клиентской машине запускаю следующую команду:
openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem
и я получаю эту ошибку:
CONNECTED(00000003)
OCSP response: no response sent
depth=1 /C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/emailAddress=tdrake@mysite.com
verify error:num=19:self signed certificate in certificate chain
verify return:0
574:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s3_pkt.c:1102:SSL alert number 48
574:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s23_lib.c:182:
Я действительно озадачен тем, что сделал не так. Я довольно много искал эту ошибку, и я обнаружил, что люди говорят, что ЦС, выдающий сертификат клиента, не доверяет серверу, но когда я смотрю на эмитента моего сертификата клиента, он соответствует одному из принятый CA, возвращенный моим сервером.
Кто-нибудь может помочь, пожалуйста?
Заранее спасибо.
Хорошо, я наконец выяснил, в чем проблема, и хотел бы поделиться ею на случай, если кто-то тоже застрянет с этим сообщением об ошибке.
В конфигурационном файле Apache, когда говорится о CA, есть следующие строки:
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
# Note: Inside SSLCACertificatePath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
Это означает, что каждый файл сертификата в этом каталоге, на который указывает SSLCACertificatePath, должен использовать символическую ссылку. И, что наиболее важно, имя каждой символической ссылки должно быть хеш-значением субъекта каждого сертификата. Вы можете найти хэш-значение сертификата CA, выполнив эту команду:
openssl x509 -subject_hash -in *cacert.pem*
Итак, если хеш-значение было 0434423b, в каталоге, на который указывает SSLCACertificatePath, вы должны создать две символические ссылки, указывающие на сертификат в каталоге:
0434423b -> /etc/apache2/certs/mypos.pem
0434423b.0 -> /etc/apache2/certs/mypos.pem
Это должно решить проблему. Конечно, если бы я использовал SSLCACertificateFile, не думаю, что у меня было бы столько проблем.
Я нашел объяснение SSLCACertificatePath здесь:
Страница команды openssl verify
посмотрите в -CApath каталог
Я обнаружил, что команда «sudo update-ca-сертификаты --fresh» автоматически генерирует символические ссылки из хэш-значения субъекта каждого сертификата на сертификат.
Привет. Вы пробовали выполнить следующую команду,
openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem -verify 1 -showcerts
Обратите внимание проверить 1. Он сообщает ssl, насколько глубоко он должен зайти, и я думаю, что это может быть проблема, с которой вы столкнулись в вашей конфигурации apache. Попробуйте установить конфигурацию apache,
SSLVerifyDepth 1
Ура, Декстер