Назад | Перейти на главную страницу

Невозможно получить самоподписанный сертификат CA для запроса соответствующего сертификата клиента; Apache

Я запускаю Apache 2.2 в Windows, и mod_ssl отлично работает для доставки коммерчески подписанного сертификата сервера. (Сертификат с подстановочными знаками, хотя я не думаю, что это имеет значение.)

Я пытаюсь заставить сервер на некоторых VirtualHosts запрашивать сертификат клиента, поэтому я создал файл SSLCACertificateFile, содержащий PEM; Насколько я понимаю, этот список подписывающих DN должен быть предложен клиенту для ответа во время установления SSL.

У меня есть личный сертификат удостоверения StartSSL, и если я помещаю корневой сертификат StartSSL в SSLCACertificateFile, браузер (протестированный Chrome и IE) выскакивает «выберите сертификат» и показывает мне мой сертификат StartSSL.

Однако мой реальный вариант использования - использовать свой собственный центр сертификации и подписывать сертификаты клиентов, и это что я не могу заставить работать. Я сам подписываю ЦС, затем создаю клиентский CSR, подписываю его сертификатом ЦС и загружаю его в свое хранилище сертификатов клиента, затем помещаю CA PEM в свой SSLCACertificateFile - и браузер не предлагает сертификат клиента в «выберите сертификат».

Черт возьми.

Поскольку все это работает с ЦС и сертификатом StartSSL, мне интересно, действительно ли это проблема с моим сертификатом ЦС или сертификатом клиента, но я не могу понять, в чем может быть проблема; сертификат CA работает для подписи и имеет CA: TRUE; клиентские сертификаты имеют цель аутентификации клиента ... чего не хватает.

Не знаю, как диагностировать; Спасибо.

Вот мой CA PEM, вставленный в SSLCACertificateFile:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            bf:45:a7:db:f9:8e:8f:d0
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
        Validity
            Not Before: Mar  8 21:39:52 2013 GMT
            Not After : Apr  7 21:39:52 2013 GMT
        Subject: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    <snip>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                5E:99:47:8A:52:D3:38:20:68:A5:91:D9:E1:2E:6B:50:0D:5C:98:CB
            X509v3 Authority Key Identifier:
                keyid:5E:99:47:8A:52:D3:38:20:68:A5:91:D9:E1:2E:6B:50:0D:5C:98:CB

            X509v3 Basic Constraints:
                CA:TRUE

Signature Algorithm: sha1WithRSAEncryption
<snip>

... и вот сертификат клиента:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 20481 (0x5001)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=California, L=San Diego, O=TestCA, OU=TestCA-OU, CN=TestCA-CN
        Validity
            Not Before: Mar  8 23:46:55 2013 GMT
            Not After : Mar  8 23:46:55 2014 GMT
        Subject: C=US, ST=California, L=San Diego, O=TestClient, OU=TestClient-OU, CN=TestClient-CN
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    <snip>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
    Signature Algorithm: sha1WithRSAEncryption
<snip>

/ *********************************************** ****************** /

Дополнительная информация по запросу Майка (мне потребовалось несколько попыток, чтобы заставить работать openssl s_client.)

Вот результаты: [...]

---
Acceptable client certificate CA names
/C=UK/O=Test Certificates/CN=Test CA
/C=US/ST=California/L=San Diego/O=TestCA/OU=TestCA-OU/CN=TestCA-CN
/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certific
ation Authority
---

[...]

Итак, сервер говорит

/ C = США / ST = Калифорния / L = Сан-Диего / O = TestCA / OU = TestCA-OU / CN = TestCA-CN

является приемлемым сертификатом клиента, и у клиента есть

Эмитент: C = США, ST = Калифорния, L = Сан-Диего, O = TestCA, OU = TestCA-OU, CN = TestCA-CN

в своем магазине, но браузер не включает это в список, из которого я могу выбрать. Браузер делает предложить клиенту сертификаты, подписанные

/ C = UK / O = Тестовые сертификаты / CN = Тестовый CA

и

/ C = IL / O = StartCom Ltd./OU=Secure Digital Certificate Signing / CN = Центр сертификации StartCom

... возвращая меня к "WTF?"

Да, я отвечаю на свой вопрос.

Решено.

Оказывается, что KeyUsage keyEncipherment НЕ является правильным keyUsage для клиента SSL / TLS. Правильное ограничение KeyUsage: KeyUsage digitalSignature; полезная информация была найдена на эта статья Mozilla.