SSL证书使用出现问题:'证书链中存在自签名证书'

5
我正在使用自行生成的通配符SSL证书,并想知道以下问题是否有问题,如果有问题,我应该如何解决。 证书适用于我的Web Ruby on Rails 3应用程序,运行在本地主机上。
我正在使用运行“Snow Leopard” 1.6.6的Mac OS。 在终端中键入
<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,在我的应用程序中,我使用以下代码通过SSL进行HTTP请求。
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'是什么意思?


为什么你的主机是“localhost.com”? - Vanwaril
2个回答

5

SSL通过检查主机的证书来验证主机的有效性。

每个证书都是:

  1. 自签名
  2. 由另一个证书签名。

如果它是由另一个证书签名的,则检查签名它的证书。

现在,为了验证证书是否有效,必须将该证书与系统上的“有效”证书存储匹配(例如:Firefox维护自己的存储,Windows有自己的存储等)。如果它将某个证书层次结构与存储中的证书匹配,则将该证书视为有效,因此由其签署的所有证书均为有效。

但是,如果证书是自签名的并且不在存储中,则会拒绝它,或者警告您无法验证该证书。

如果证书是用于测试应用程序或非常有限规模的部署,您可以要求人们将您的证书添加到其存储中,这是可以接受的。 但是,如果您计划将应用程序移动到somedomain.com的生产站点,则可能需要为该域购买证书。

注意:在任一情况下,您为localhost拥有的自签名证书仅适用于“localhost”,即使通过IP在内部网络中访问也是如此


SSL的VERIFY_PEER意味着每当通过SSL建立连接时,它会检查证书并验证另一端是否有效。如果禁用它,则根本不进行检查。 - Vanwaril
在本地主机中,我使用“VERIFY_NONE”,但在生产模式下建议使用“VERIFY_PEER”。因此,当我部署应用程序时,我必须手动更改所有这些出现的情况吗?!!! - user502052
编写一个脚本来为您进行这些更改--它可以是应用差异的简单操作。 - Vanwaril

2
SSL证书的目的是为了证明主机是其所声称的,而不是伪造的。为此,证书由证书颁发机构颁发,他们应该正确检查请求证书的个人或组织的身份。因此,自签名证书不能可靠地识别主机(即使它是本地主机)。因此,大多数应用程序在证书链中看到自签名证书时会报告验证错误。唯一的例外通常是当证书被显式添加到系统中的私有证书列表中时,它将被接受为有效证书。
因此,如果您在计算机上为测试目的创建了自签名证书,则可以将其添加到信任列表中。否则(如果您需要公共主机的证书),您将需要从证书颁发机构之一购买证书。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接