2015-02-28 1 views
0

У меня возникла проблема с экспортом самозаверяющего сертификата клиента из хранилища ключей Java в файл pem. Я хочу, чтобы моя серверная программа C++ SSL проверяла этот сертификат собственного знака. Если я создаю сам подписанный сертификат через openssl, он работает, то есть сервер проверяет сертификат. Если я использую самозаверяющий сертификат, экспортированный из JKS, он не проверяется и рукопожатие не выполняется. Я использую следующие функции SSL на сервере для проверки сертификата клиента.Авторизованный сертификат, экспортированный с Java KS, не работает

SSL_CTX_load_verify_locations(*ctx, szloc, NULL) 
SSL_CTX_set_verify(*ctx, SSL_VERIFY_PEER, NULL); 
SSL_CTX_set_verify_depth(*ctx, 0); 

Я распечатал содержимое обоих клиентских сертификатов.

Cert, который работает:

Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 530171964 (0x1f99c83c) 
     Signature Algorithm: sha256WithRSAEncryption 
     Issuer: C=US, ST=OR, L=Salem, O=mahaus, OU=maroom client, CN=lenovo-pc 
     Validity 
      Not Before: Feb 27 13:21:37 2015 GMT 
      Not After : May 28 13:21:37 2015 GMT 
     Subject: C=US, ST=OR, L=Salem, O=mahaus, OU=maroom client, CN=lenovo-pc 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:d2:65:56:a8:1e:66:7b:70:c9:a2:73:ae:77:58: 
        cb:bf:bf:0a:62:66:5a:5d:34:3b:22:32:75:82:73: 
        b6:08:01:e8:0d:ab:d0:03:d8:3b:82:9d:84:2d:d0: 
        6c:86:82:f9:00:ea:19:57:2c:89:51:7d:6a:b3:f9: 
        75:4c:a2:57:df:9c:f5:96:bd:ff:f1:8c:4d:1d:17: 
        f5:b8:95:22:f2:9c:91:92:20:38:9e:b3:99:0a:80: 
        96:51:35:12:5b:4e:88:43:f0:0b:d5:02:b9:80:00: 
        1c:9a:af:42:9a:9e:44:e3:d4:c8:04:cd:11:d2:8f: 
        7f:78:90:58:bd:15:22:e1:d3:54:fd:c9:b0:65:20: 
        c4:f2:0b:37:62:40:f6:13:ab:ef:ce:c9:8a:1a:9a: 
        07:95:ad:96:9e:e4:48:a1:fd:32:a0:2a:02:5c:74: 
        4c:fd:ef:d6:13:af:a2:bb:00:f3:5c:c8:ee:a8:26: 
        fb:63:a3:50:81:45:88:44:03:dc:99:60:81:52:6b: 
        c7:51:e2:30:fd:68:90:f1:95:74:f8:72:23:56:3d: 
        35:16:18:a1:03:e0:87:36:d0:8d:ce:99:19:b0:57: 
        c7:3d:2a:86:d0:78:91:d8:2c:df:a2:1b:42:34:3b: 
        d1:cc:6d:96:34:73:b3:1b:31:ce:1b:36:7a:43:38: 
        45:95 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Key Identifier: 
       EA:E7:82:0D:CA:DD:8A:F6:89:99:04:65:5F:F4:6E:30:91:FE:80:41 
    Signature Algorithm: sha256WithRSAEncryption 
     6a:a1:2c:42:57:7b:9c:18:88:e4:98:8d:e3:a8:9b:ca:c9:5f: 
     9e:5a:c0:23:95:f6:e8:b3:44:0e:70:77:11:52:b2:de:a6:e1: 
     a9:0a:66:fc:3a:b2:e9:f2:53:14:fa:5e:7b:69:c9:fe:de:64: 
     4d:40:b3:a3:c7:cb:c7:cd:87:79:0c:2d:f4:f1:8c:54:fa:44: 
     75:17:16:05:a7:14:d8:60:fd:20:3a:ec:49:9c:27:96:53:8e: 
     9d:93:24:2d:cb:f2:f9:1c:ee:da:90:75:6b:5f:9e:f4:fd:fc: 
     60:97:ab:d6:7a:61:89:25:26:a0:15:ed:9e:02:ba:4e:02:50: 
     83:bc:06:2b:23:6a:74:50:87:2e:17:8d:3f:1f:f0:c9:4f:08: 
     36:b8:4d:62:53:e6:5a:f5:d3:c2:71:11:58:5d:4f:91:24:32: 
     c9:ee:33:8a:c3:24:64:e3:80:7b:28:e1:5c:ca:84:02:ef:71: 
     d0:0a:a0:09:95:82:34:f1:3a:06:19:9e:01:fe:6c:92:a4:a5: 
     da:d7:05:29:90:3b:26:7a:b9:19:33:7e:be:fc:59:cb:d0:9e: 
     28:80:57:ed:e4:b6:95:19:31:c7:4b:62:26:16:53:0b:fc:ef: 
     d9:88:9b:1a:a6:99:d7:4b:73:ad:15:97:c2:6e:12:75:77:d1: 
     60:5f:bb:41 

вывезенных серт от JKS, что не работает:

Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 
      cd:19:9c:68:d1:c5:ca:c2 
     Signature Algorithm: sha1WithRSAEncryption 
     Issuer: C=US, ST=IL, L=Springfield, O=macompany, OU=yourus, CN=ABC 
     Validity 
      Not Before: Feb 27 19:23:33 2015 GMT 
      Not After : Feb 27 19:23:33 2016 GMT 
     Subject: C=US, ST=IL, L=Springfield, O=macompany, OU=yourus, CN=ABC 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:db:ef:24:8e:ee:3e:b1:14:18:8e:ba:17:ee:68: 
        34:d2:ac:98:29:53:97:f0:a4:21:c7:82:4c:10:ab: 
        97:17:dd:b6:88:ca:63:ad:68:7b:85:ed:94:93:64: 
        b4:53:f2:d4:ce:2f:9e:a2:3b:87:70:66:20:f3:ad: 
        30:e1:a0:31:0d:80:dd:c6:38:ed:5d:ec:d7:5c:a2: 
        89:d6:c6:ad:a1:7d:63:1a:df:5b:8b:6d:c5:94:f1: 
        fc:58:0e:a1:6f:f5:24:11:ed:be:06:f3:f1:dc:a7: 
        d3:43:c6:a2:b4:68:e5:20:ba:bd:1b:7c:f8:29:69: 
        79:f5:69:07:c1:ec:a8:78:dc:65:74:ed:bd:72:b1: 
        72:36:5b:b7:2a:a7:d3:2b:f2:45:af:64:62:de:e4: 
        4d:8b:2f:68:f3:24:bd:33:38:dd:17:00:64:e6:c2: 
        c8:2e:85:36:a2:52:6d:f7:dc:59:70:84:a2:23:7e: 
        f3:29:d6:ee:1e:07:06:c5:2a:37:3d:b2:05:b4:44: 
        82:c4:7c:a6:30:a4:90:96:f6:7a:1a:58:3c:e6:11: 
        ee:17:3d:3c:6c:b5:0d:46:b1:71:78:b5:b1:99:73: 
        aa:05:aa:a3:9f:10:ed:03:63:ae:30:c8:b2:62:a5: 
        77:d2:a0:b4:1f:f7:db:ca:bf:02:a2:f6:5a:91:91: 
        e2:9f 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Key Identifier: 
       D5:FA:5F:9D:75:7A:DB:6F:D5:4B:62:CF:59:6D:BC:B5:AE:63:78:8D 
      X509v3 Authority Key Identifier: 
       keyid:D5:FA:5F:9D:75:7A:DB:6F:D5:4B:62:CF:59:6D:BC:B5:AE:63:78:8D 

      X509v3 Basic Constraints: 
       CA:TRUE 
    Signature Algorithm: sha1WithRSAEncryption 
     4f:c4:26:bf:4d:04:09:30:4b:75:31:25:73:48:15:aa:34:7c: 
     fa:86:b1:63:49:e2:4d:67:5c:9b:de:4a:39:f4:a3:58:fe:f5: 
     13:bf:ac:b6:81:9f:37:f4:db:c9:80:e8:fe:3b:f4:2a:54:5c: 
     95:1d:56:9a:1e:10:10:c9:7e:12:05:b6:f6:17:60:1a:b1:8e: 
     33:49:56:87:9d:ba:7d:56:02:7b:2d:82:81:98:12:a5:b2:b1: 
     33:db:ef:e5:b0:f3:96:c0:65:0d:6f:a9:5d:e9:81:fc:78:a5: 
     07:f1:3f:f7:64:0c:13:58:25:ff:b1:73:b7:bf:d3:a2:ac:f3: 
     d4:c9:e4:ed:1c:92:30:ef:00:d8:e8:ba:a2:69:6a:e0:07:18: 
     a1:20:e5:e4:fd:1a:c9:91:0e:7b:7b:e7:81:e3:ad:8f:b2:88: 
     5e:ee:dc:a9:36:e5:75:a4:0d:26:26:2c:f2:8e:99:de:0f:5e: 
     0b:a6:85:c4:b8:88:ca:43:43:b7:27:23:f0:d6:94:b6:e9:8d: 
     b2:ad:a1:f4:d5:62:ff:4e:ec:9a:4f:3b:73:a0:32:0c:3a:cb: 
     dc:3b:7c:26:72:bf:68:39:da:44:eb:95:ef:02:86:f6:be:46: 
     8d:62:82:d9:59:6d:1a:ce:a8:09:ed:16:fe:e1:12:72:9b:0c: 
     a6:10:22:47 

BTW этот сертификат успешно загружен на ++ стороне клиента C, что означает, что нет несоответствия с закрытый ключ на клиенте.

Единственное различие, которое я вижу, который я предположил, возможно, что-то делать с этой проблемой является экспортированный сертификат отсутствует следующая информация о CA под X509v3 extensions разделе:

X509v3 Authority Key Identifier: 
     keyid:D5:FA:5F:9D:75:7A:DB:6F:D5:4B:62:CF:59:6D:BC:B5:AE:63:78:8D 

    X509v3 Basic Constraints: 
     CA:TRUE 

Это причина, по второй (экспортировано из JKS) Проверка сертификата на сервере не работает? Если да, то как я буду экспортировать необходимые расширения? Если нет, то что еще это может быть?

Буду признателен за любую помощь. Благодарю.

+0

Эти расширения не требуются. Они удобны, если вы хотите проследить цепочку вручную, но не влияете на проверку. Основное различие заключается в том, кто их подписал, Алгоритм подписи: sha256WithRSAEncryption vs sha1WithRSAEncryption. Прочтите документы, чтобы узнать, какой файл контейнера хранит ваши доверенные сертификаты CA для этой платформы и загружает сертификат CA для сертификата, который не работает (CA для самоподписанного сертификата является самоподписанным сертификатом, что делает его корневым центром сертификации). – gobbly

ответ

1

Вам не нужен необходимо идентификатор ключа управления (AKI) для успешной проверки сертификата x509. Подробности находятся в RFC, но я думаю, что самоподписанные сертификаты (включая корневые ЦС) не требуют этого. Кроме того, оба сертификата, перечисленные выше, имеют действительные значения AKI, поэтому я не думаю, что это ваша проблема. Если эти сертификаты были созданы с помощью openssl или Java keytool, то значения AKI отлично.

Я предполагаю, что ваша цепочка доверия нарушена для сертификата, который не проходит успешно. Ваш сервер (программа на C++) получает от него цепочку доверия - в Java цепочка доверия обычно поступает из файла cacerts, расположенного по адресу jre/lib/security/cacerts. Чтобы успешно проверить, ваш самоподписанный сертификат должен быть указан как доверенный эмитент. Вы можете добавить доверенного эмитента в Java с помощью команды keytool keytool -import -trustcacerts -alias yourCert -file file.cer. Я не уверен, где находится хранилище доверия C++ или эквивалентная команда.

Если вы просматриваете перечисленные вызовы функций, похоже, что это функции OpenSSL, поэтому ваше хранилище доверия OpenSSL должно содержать ваш самозаверяющий сертификат в качестве доверенного корневого ЦС. Похоже, есть инструкции онлайн для разных систем, просто посмотрите «Магазин доверия OpenSSL».

+0

О, хорошо. Таким образом, сам подписанный сертификат, который я создаю с помощью openssl, который работает, должен автоматически добавлять его в список ключей доверенных сертификатов openssl автоматически во время создания, основываясь на том, что вы говорите. Согласитесь?Поэтому, вероятно, мне нужно добавить экспортированный сертификат в список доверенных сертификатов openssl keystore? – driftwood

+1

@ user2722568 Да, для проверки сервера сертификата клиента хранилище доверия сервера должно содержать центр сертификации клиента (CA). Поэтому, если вы перейдете на любой сайт https, браузер предоставит вам сертификат, если хранилище доверия браузера не отображает CA сертификата сервера. Я не уверен, где находится хранилище доверия, на которое опирается ваша программа на C++, вы не указали достаточно подробностей. Если это Windows Server, вы можете открыть файл mmc.exe, добавить оснастку «сертификаты», а затем добавить свой сертификат в качестве доверенного корневого центра сертификации. – KyleM

+0

Да, все в Windows. Хорошо, я попробую. Благодарю. – driftwood