Проблема с использованием сертификата SSL: «самоподписанный сертификат в цепочке сертификатов» - PullRequest
5 голосов
/ 19 февраля 2011

Я использую самогенерируемый подстановочный SSL-сертификат , и я хотел бы знать, является ли проблема следующей, и если да, что я могу сделать, чтобы это исправить.Сертификат предназначен для моего веб-приложения Ruby on Rails 3, работающего на localhost.

Я использую Mac OS под управлением Snow Snow Leopard 1.6.6.Набрав в Терминале

<my_user_name>$ openssl s_client -connect localhost.com:443

я получаю следующее:

CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = My Name\Surname
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=*localhost.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=My Name\Surname
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=My Name\Surname
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=My Name\Surname
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICJDCCAY0CAQEwDQYJKoZIhvcNAQEEBQAwWTELMAkGA1UEBhMCQVUxEzARBgNV
BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
ZDESMBAGA1UEAwwJU2VyZ2lvIEwuMB4XDTExMDIxODIwMDAwOFoXDTEyMDIxODIw
MDAwOFowXDELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNV
BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEVMBMGA1UEAwwMKnBqdG5hbWUu
Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDM46dH9rWKy5sNKBwJ7oo
wytsjw8fFLRskJGE0QqgKpz5ZtYK8yC/kifI4gpWZYVySePmVqHR6+wpv8Ry1KVx
Bl2qhF6ssLBbc5bvOK4eF2Rx9LNAZ/ndy+0q07DVsnAMMCxhNmegltCG1JZhazCG
g7elPm2pIQLAQvKlFSJwkQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBADO7XJbOASZM
Bm/XElq1AuVU1dR6/wkowLOxCn8+KWsUmyIdZj1yL8+83nhhG/yekzOr25n/I0SQ
zN1aUi3oX5vXlx8vp2xQsnug2BM/InfQxOn+90JjhZYPbCokH9ifzYsNj7fvGg57
KZ4et2jSfchxFMRqqoPutdOp/gNKw3me
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=*localhost.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=My Name\Surname
---
No client certificate CA names sent
---
SSL handshake has read 1944 bytes and written 409 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS NOT supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 63BE474E62950D542BCBE30F72F80C28851EE23EA15BA34AE3E3E46AB5615505
    Session-ID-ctx: 
    Master-Key: 9E8A8F7F4E824A2B251D5A28E3A133AC761BA8EDB237073973D2B1AE0AE0A31ADDADA2315F33B443B3F29D382070FC6C
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket:
    0000 - 10 b0 f3 4d 96 90 d3 65-22 d4 bf 09 27 8c a0 af   ...M...e"...'...
    0010 - d3 79 5c 9a cf d9 5b e1-3f aa 46 56 55 9b 55 50   .y\...[.?.FVU.UP
    0020 - 8b 49 99 07 bc 35 e0 bc-e1 1d 4e 61 f0 aa 33 57   .I...5....Na..3W
    0030 - 1d 37 0b dd 51 ae 81 ea-df 8e 6e 25 ff f7 2b ff   .7..Q.....n%..+.
    0040 - e9 88 79 e4 57 2a b2 f2-61 22 df 86 f0 24 57 a7   ..y.W*..a"...$W.
    0050 - 06 13 b5 71 47 dc d5 ac-c2 61 89 75 6e 03 45 cc   ...qG....a.un.E.
    0060 - 14 69 0c 72 3a 4a 00 b3-4f d8 8d 44 2d 66 cb 40   .i.r:J..O..D-f.@
    0070 - 80 c8 9b e2 12 9f 0d b4-58 6e a1 c7 bb fe 92 6d   ........Xn.....m
    0080 - b8 b7 b7 f0 dc 1c ab fd-44 a4 25 96 c6 09 09 a1   ........D.%.....
    0090 - aa ff c0 dc 53 6b 30 13-30 f3 44 f6 78 b1 43 c7   ....Sk0.0.D.x.C.
    00a0 - ca 88 9d 63 41 d3 c1 a1-af fa 36 e2 9c fd 0e 62   ...cA.....6....b
    00b0 - c4 44 6b 5c 74 da ff be-a8 98 3f 54 f9 fa 59 15   .Dk\t.....?T..Y.

    Compression: 1 (zlib compression)
    Start Time: 1298072476
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)

Возможно, проблема в строке 3 : verify error:num=19:self signed certificate in certificate chain.Что это значит?Работает ли мой сертификат для localhost.com?


ОБНОВЛЕНИЕ

В браузере я принял свой подписанный сертификат (я явно добавил свой сертификат в списокчастные сертификаты в системе), поэтому даже я получаю verify error:num=19:self signed certificate in certificate chain, и в своем приложении я использую следующий код для выполнения HTTP-запросов по SSL

require 'uri'
require 'net/https'

host = "https://<subdomain>.localhost.com"
path = "/users/1.json"

uri = URI.parse("#{host}#{path}")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

http.verify_mode = OpenSSL::SSL::VERIFY_NONE
# I think here is necessary to verify connections using 'http.verify_mode = OpenSSL::SSL::VERIFY_PEER':
# in localhost using that the connection will fault, but in production mode 
# (when I will deploy the application) I think I MUST use 'VERIFY_PEER'

http.ca_file = File.join(File.dirname("<certificate_folder>/wildcard.certificate/ca.db.certs/"), "01.pem")

http.start do
  response = http.get("#{host}#{path}")
  @test_response = JSON(response.body)["profile"]
end

соединение на самом деле идет по SSL?«VERIFY_PEER» что-то значит?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2011

SSL проверяет действительность хоста, проверяя сертификат хоста.

Каждый сертификат является либо:

  1. Самоподписной
  2. Подписано другим сертификатом.

Если он подписан другим сертификатом, он проверяет сертификат, который его подписал.

Теперь, в какой-то момент, чтобы проверить, является ли сертификат действительным или нет, он должен сопоставить этот сертификат с хранилищем «действительных» сертификатов, которые он имеет в системе (например, Firefox поддерживает свое собственное хранилище, Windows имеет его собственный магазин и т. д.). Если он сопоставляет некоторый сертификат в иерархии с хранилищем, то он обрабатывает этот сертификат как действительный, и, следовательно, все сертификаты, подписанные им, являются действительными.

Однако , если сертификат самоподписан и отсутствует в хранилище, он отклонит его или предупредит, что не может проверить сертификат.

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

Примечание: в любом случае самозаверяющий сертификат, который у вас есть для localhost, действителен только для 'localhost', даже если он доступен в интрасети по IP

2 голосов
/ 19 февраля 2011

Цель сертификатов [в SSL] состоит в том, чтобы доказать, что хост является тем, на кого он претендует, а не поддельным. Для этого сертификаты выдаются центрами сертификации, которые [должны надлежащим образом] проверять личность человека или организации, которая запрашивает сертификат. Следовательно, самозаверяющий сертификат не может надежно идентифицировать хост (даже если это локальный хост). Поэтому большинство приложений сообщают об ошибке проверки, когда они видят самозаверяющий сертификат в цепочке сертификатов. Единственное исключение - [обычно], когда сертификат явно добавляется в список частных сертификатов в системе - в этом случае он считается действительным.

Следовательно, если вы создали самозаверяющий сертификат для тестирования на своем компьютере, вы можете добавить его в список доверенных. В противном случае (если вам нужен сертификат для публичного хоста), вам нужно будет купить сертификат в одном из центров сертификации.

...