рубиновый HTTPClinet — SSL и set_auth

Я пытаюсь понять, что здесь происходит не так. По непонятным мне причинам для программного обеспечения моей компании требуется два порта для подключения с использованием NTLM. Первоначально он подключается к 443, затем перенаправляется на 4244 для аутентификации, а затем возвращается на 443. Один и тот же сертификат привязан на сервере к обоим портам.

Мой первый HTTPS GET работает нормально, однако второй жалуется на сертификат. Я считаю, что это связано с редиректом назад. Если я установлю домен для set_auth на 4244, произойдет сбой при обратном перенаправлении, если я установлю для него значение 443 (т. е. оставлю порт выключенным), тогда он не сможет пройти аутентификацию.

client = HTTPClient.new()
client.ssl_config.set_trust_ca('./SenseStandalone/root.pem')
client.ssl_config.set_client_cert_file(cert, key)
...
@base_uri = "https://SenseStandalone"
https_url = @base_uri+path #+'?xrfkey='+@xrf
client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
client.set_auth(@base_uri, 'login', 'password')
t = client.get(https_url, query, extheader, :follow_redirect => true)
pp t
redirect = t.http_header.request_uri.to_s
puts redirect
client.set_auth('https://SenseStandalone:4244', 'login', 'password')
r = client.get(redirect, nil, extheader, :follow_redirect => true)
pp r.status_code, r.body

Что мне действительно нужно, так это возможность установить домен на весь сервер. Установка его на «ноль» приводит к полному сбою.

Конечно, я могу исправить это с помощью:

client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE

Но я бы предпочел не делать этого, если бы у меня был выбор.

Кроме того, есть идеи, почему мне нужно сделать первую переадресацию вручную? Второй перенаправляет сам.

Фактическая ошибка: если быть точным, ошибка следующая: C:/dev/Ruby22-x64/lib/ruby/2.2.0/openssl/ssl.rb:240:in `post_connection_check': не соответствует сертификату сервера (OpenSSL::SSL::SSLError)

Сертификат одинаков для обоих портов:

C:\Windows\system32>netsh http show sslcert

Привязки сертификатов SSL:

IP:port                      : 0.0.0.0:4244
Certificate Hash             : 7b2969cf62af93fc0ebca19b597a370a32be89b7
Application ID               : {cebd7eb4-e9bb-4377-85be-d961248daa80}
Certificate Store Name       : (null)
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check                  : Enabled
Revocation Freshness Time    : 0
URL Retrieval Timeout        : 0
Ctl Identifier               : (null)
Ctl Store Name               : (null)
DS Mapper Usage              : Disabled
Negotiate Client Certificate : Disabled

IP:port                      : 0.0.0.0:443
Certificate Hash             : 7b2969cf62af93fc0ebca19b597a370a32be89b7
Application ID               : {3af37b68-4503-431e-b020-9e85fe225814}
Certificate Store Name       : (null)
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check                  : Enabled
Revocation Freshness Time    : 0
URL Retrieval Timeout        : 0
Ctl Identifier               : (null)
Ctl Store Name               : (null)
DS Mapper Usage              : Disabled
Negotiate Client Certificate : Disabled

SSL-сертификат (443):

C:\openssl\bin>openssl s_client -connect sensestandalone:443 -tls1 -servername sensestandalone | openssl x509 -text -noout
Loading 'screen' into random state - done
depth=0 CN = SenseStandalone
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = SenseStandalone
verify error:num=21:unable to verify the first certificate
verify return:1
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d9:cd:81:4e:f8:8c:28:ed:f5:1d:0c:67:ae:5c:45
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=SenseStandalone-CA
        Validity
            Not Before: Jan  2 04:19:53 2017 GMT
            Not After : Jan  9 04:19:53 2027 GMT
        Subject: CN=SenseStandalone
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:8b:23:c4:f9:6c:d2:19:90:db:9c:51:2a:14:5e:
                    88:c5:24:cf:e9:3a:67:82:7a:8f:db:9b:ad:39:99:
                    9c:4c:1c:c4:11:ae:6a:96:20:24:e1:e2:19:c3:9e:
                    53:ba:52:45:4d:93:79:80:8b:c3:d9:3f:e7:7e:88:
                    65:16:b7:e5:84:8e:7c:1d:1e:e4:b4:df:29:8b:b4:
                    1e:6b:c2:c0:b8:83:78:16:de:4d:65:80:b0:b5:c6:
                    53:86:05:63:b3:2b:52:a0:20:8a:35:b0:fc:5d:25:
                    e8:77:32:b3:8c:28:b3:53:39:d1:4e:7b:df:0b:ee:
                    4c:51:bd:bf:01:f2:99:4b:59:31:c2:8e:04:a3:15:
                    0e:2c:34:da:e7:66:11:1d:77:85:80:28:d2:6b:05:
                    97:28:c0:97:a3:e4:8e:28:a7:d0:24:d5:69:da:e2:
                    2c:b1:5f:ee:5b:28:4e:44:04:c2:45:32:26:d7:8f:
                    19:56:95:e1:2a:ac:72:e1:57:ef:85:7e:53:dc:09:
                    44:22:4e:02:d6:20:69:02:c0:6a:49:23:76:5e:6d:
                    4f:e1:c6:9c:1b:a2:75:9d:b2:f7:65:89:cf:89:10:
                    37:c3:57:b0:a8:77:aa:c4:15:a8:7c:00:e6:75:c9:
                    06:7d:76:9e:cb:51:e9:ae:4e:e9:f8:57:ee:e2:e4:
                    de:c7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                17:90:47:3E:66:51:DA:14:1A:A5:85:77:D2:36:66:61:E4:3A:08:FF
            X509v3 Authority Key Identifier:
                keyid:C9:D1:A4:38:7F:FA:6F:9A:05:DD:CC:8A:D9:7B:4C:12:98:38:86:AE

            1.3.6.1.5.5.7.13.3:
                ..Service
            1.3.6.1.5.5.7.13.1:
vgu,...e...q......Y.*r...GiG!./aL..+..O......>..w.9...M`f..,....T..w`...i^.b..&...!C.... ]..{h9.W...W3...F(...(=.)..Z....x..F..2
            1.3.6.1.5.5.7.13.2:
...SJ....S.8/....................(P*R.............5]..........?..b..l..=\.O......L.W.x.,.......|.. .,....t2aK..z)..s=..3,......x
    Signature Algorithm: sha256WithRSAEncryption
         27:2d:1d:c1:43:00:77:ec:76:a9:f1:f8:c3:73:26:58:e8:7d:
         fc:61:3b:cf:91:dd:cf:b7:6c:66:ac:5d:c7:bb:08:10:85:2a:
         4a:be:b8:d2:df:c3:02:ff:02:f9:9d:89:e7:6c:6c:82:d9:99:
         9a:47:2a:65:01:c8:d2:ad:f4:c8:e1:a4:12:72:3a:c6:11:d6:
         90:b2:4e:2a:42:a5:d6:53:69:1b:57:ee:2c:02:b6:a1:8a:a5:
         bb:6d:23:04:46:69:74:fa:c7:f3:70:d4:a7:d0:8b:ca:cd:ff:
         65:5e:e3:44:20:be:28:58:08:5b:5f:9d:f0:07:1b:b9:ee:ca:
         7e:33:99:49:2e:57:b8:5e:dd:82:e4:7e:85:33:e7:3d:27:7c:
         d5:a9:b0:24:22:6b:17:3e:34:91:c6:a0:22:b7:3c:85:6c:64:
         ed:d2:72:a7:ac:a7:5d:04:b5:fa:4a:48:49:bc:31:0f:48:38:
         20:84:4e:a3:fe:f2:2c:bc:89:ee:0d:2f:4d:3f:87:29:9f:f7:
         c6:3d:97:a3:12:28:a0:92:5a:64:7f:45:de:18:b3:c3:91:5f:
         eb:85:9a:99:e9:e2:f5:cc:a6:47:65:5f:be:d6:dd:50:88:38:
         5c:17:88:16:25:07:20:e2:cd:13:ca:69:14:97:73:ad:d9:cd:
         52:3b:0b:e4

SSL-сертификат (4244):

C:\openssl\bin>openssl s_client -connect sensestandalone:4244 -tls1 -servername sensestandalone | openssl x509 -text -noout
depth=0 CN = SenseStandalone
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = SenseStandalone
verify error:num=21:unable to verify the first certificate
verify return:1
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d9:cd:81:4e:f8:8c:28:ed:f5:1d:0c:67:ae:5c:45
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=SenseStandalone-CA
        Validity
            Not Before: Jan  2 04:19:53 2017 GMT
            Not After : Jan  9 04:19:53 2027 GMT
      Subject: CN=SenseStandalone
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:8b:23:c4:f9:6c:d2:19:90:db:9c:51:2a:14:5e:
                    88:c5:24:cf:e9:3a:67:82:7a:8f:db:9b:ad:39:99:
                    9c:4c:1c:c4:11:ae:6a:96:20:24:e1:e2:19:c3:9e:
                    53:ba:52:45:4d:93:79:80:8b:c3:d9:3f:e7:7e:88:
                    65:16:b7:e5:84:8e:7c:1d:1e:e4:b4:df:29:8b:b4:
                    1e:6b:c2:c0:b8:83:78:16:de:4d:65:80:b0:b5:c6:
                    53:86:05:63:b3:2b:52:a0:20:8a:35:b0:fc:5d:25:
                    e8:77:32:b3:8c:28:b3:53:39:d1:4e:7b:df:0b:ee:
                    4c:51:bd:bf:01:f2:99:4b:59:31:c2:8e:04:a3:15:
                    0e:2c:34:da:e7:66:11:1d:77:85:80:28:d2:6b:05:
                    97:28:c0:97:a3:e4:8e:28:a7:d0:24:d5:69:da:e2:
                    2c:b1:5f:ee:5b:28:4e:44:04:c2:45:32:26:d7:8f:
                    19:56:95:e1:2a:ac:72:e1:57:ef:85:7e:53:dc:09:
                    44:22:4e:02:d6:20:69:02:c0:6a:49:23:76:5e:6d:
                    4f:e1:c6:9c:1b:a2:75:9d:b2:f7:65:89:cf:89:10:
                    37:c3:57:b0:a8:77:aa:c4:15:a8:7c:00:e6:75:c9:
                    06:7d:76:9e:cb:51:e9:ae:4e:e9:f8:57:ee:e2:e4:
                    de:c7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                17:90:47:3E:66:51:DA:14:1A:A5:85:77:D2:36:66:61:E4:3A:08:FF
            X509v3 Authority Key Identifier:
                keyid:C9:D1:A4:38:7F:FA:6F:9A:05:DD:CC:8A:D9:7B:4C:12:98:38:86:AE

            1.3.6.1.5.5.7.13.3:
                ..Service
            1.3.6.1.5.5.7.13.1:
vgu,...e...q......Y.*r...GiG!./aL..+..O......>..w.9...M`f..,....T..w`...i^.b..&...!C.... ]..{h9.W...W3...F(...(=.)..Z....x..F..2
            1.3.6.1.5.5.7.13.2:
...SJ....S.8/....................(P*R.............5]..........?..b..l..=\.O......L.W.x.,.......|.. .,....t2aK..z)..s=..3,......x
    Signature Algorithm: sha256WithRSAEncryption
         27:2d:1d:c1:43:00:77:ec:76:a9:f1:f8:c3:73:26:58:e8:7d:
         fc:61:3b:cf:91:dd:cf:b7:6c:66:ac:5d:c7:bb:08:10:85:2a:
         4a:be:b8:d2:df:c3:02:ff:02:f9:9d:89:e7:6c:6c:82:d9:99:
         9a:47:2a:65:01:c8:d2:ad:f4:c8:e1:a4:12:72:3a:c6:11:d6:
         90:b2:4e:2a:42:a5:d6:53:69:1b:57:ee:2c:02:b6:a1:8a:a5:
         bb:6d:23:04:46:69:74:fa:c7:f3:70:d4:a7:d0:8b:ca:cd:ff:
         65:5e:e3:44:20:be:28:58:08:5b:5f:9d:f0:07:1b:b9:ee:ca:
         7e:33:99:49:2e:57:b8:5e:dd:82:e4:7e:85:33:e7:3d:27:7c:
         d5:a9:b0:24:22:6b:17:3e:34:91:c6:a0:22:b7:3c:85:6c:64:
         ed:d2:72:a7:ac:a7:5d:04:b5:fa:4a:48:49:bc:31:0f:48:38:
         20:84:4e:a3:fe:f2:2c:bc:89:ee:0d:2f:4d:3f:87:29:9f:f7:
         c6:3d:97:a3:12:28:a0:92:5a:64:7f:45:de:18:b3:c3:91:5f:
         eb:85:9a:99:e9:e2:f5:cc:a6:47:65:5f:be:d6:dd:50:88:38:
         5c:17:88:16:25:07:20:e2:cd:13:ca:69:14:97:73:ad:d9:cd:
         52:3b:0b:e4

Оба раза команда зависала в конце.


person Leigh K    schedule 26.01.2017    source источник
comment
В модели веб-безопасности origin — это триплет {протокол, хост, порт}. Что касается веб-компонентов, https://SenseStandalone и https://SenseStandalone:4244 имеют разное происхождение и находятся в разных контекстах безопасности. Это может объяснить вашу проблему с перенаправлением.   -  person jww    schedule 26.01.2017
comment
Добавлена ​​фактическая ошибка и привязки выше. Для сертификата нет альтернативных имен. Я могу проверить полное доменное имя на следующей неделе, если вы считаете, что это может иметь значение.   -  person Leigh K    schedule 26.01.2017
comment
NB: Единственное имя, которое у него есть, — «sensestandalone».   -  person Leigh K    schedule 26.01.2017
comment
Таким образом, наше программное обеспечение создает сертификаты, а не я. Это часть продукта нашей компании   -  person Leigh K    schedule 26.01.2017
comment
Я никогда не видел такого сертификата, но я не собираюсь говорить, что он неправильно сформирован, потому что частная PKI может делать все, что захочет. Было бы очень приятно видеть имя хоста в Альтернативном имени субъекта (SAN), потому что это позволит избежать многих вопросов, что если. Поставляет ли ваша компания специальное программное обеспечение Ruby для работы с сертификатами (например, Gem?).   -  person jww    schedule 26.01.2017
comment
Я собираюсь кое-что выплюнуть, так что отнеситесь к этому с недоверием (и имейте в виду комментарий SAN). Вы делаете запрос, используя sensestandalone, но сертификат X.509 имеет CN=SenseStandalone. Согласно RFC 6125, раздел 6.4.1: Если DNS-доменное имя ... является традиционным доменным именем, тогда сопоставление ... выполняется путем сравнения набора меток доменных имен с использованием сравнения ASCII без учета регистра, как указано в [DNS-CASE]. [DNS-CASE] — это просто строчные буквы. Можете поставить точку останова в ssl.rb и посмотреть, что там происходит?   -  person jww    schedule 26.01.2017
comment
Или, может быть, вы можете получить новые сертификаты, выпущенные для целей тестирования, с CN=sensestandalone (т.е. имя в нижнем регистре)? Еще одна вещь, которую я хотел бы видеть, — это альтернативное имя субъекта (SAN), добавленное к каждому сертификату. Вы можете подумать о регистрации ошибки, потому что она отсутствует. В PKIX требуется его nealry, но частная PKI может делать все, что захочет. Теперь проблема в том, что Ruby использует правила PKIX, а не правила Private PKI. Также см. Как создать самозаверяющий сертификат с помощью openssl?. Он дает вам правила и цитирует стандарты.   -  person jww    schedule 26.01.2017
comment
Моя компания вообще ничего не делает с рубином — возможно, я буду первым, кто попытается это сделать. Если вы можете предоставить мне ссылку на SAN, я могу зарегистрировать ошибку с ними. Программное обеспечение генерирует собственные самозаверяющие сертификаты, поэтому я могу переустановить его и изменить имя на нижний регистр (и/или полное доменное имя).   -  person Leigh K    schedule 26.01.2017


Ответы (1)


Так мне удалось получить сертификат отличия. Я установил и полное доменное имя, и имя хоста как SAN в нижнем регистре.
Одно из них решило мою проблему. Я не уверен, какой. Я был бы признателен за ссылку на требование альтернативных имен субъекта, поскольку разработчики, с которыми я разговаривал, как моя компания, рассматривают это как просто предложение.

person Leigh K    schedule 28.01.2017