2011-02-18 210 views
4

我正在使用自己生成的通配證書SSL證書我想知道以下是否是問題,如果是,我可以做些什麼解決該問題。證書適用於在本地主機上運行的我的Web Ruby on Rails 3應用程序。使用SSL證書時遇到問題:'證書鏈中的自簽名證書'

我使用運行「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:[email protected] 
    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


UPDATE

在瀏覽器中我接受了我的SEL簽名證書(我明確地將我的證書在系統中的私人證書列表),所以,即使我得到verify error:num=19:self signed certificate in certificate chain和我的應用程序我使用以下代碼通過SSL發出HTTP請求

require 'uri' 
require 'net/https' 

host = "https://<subdomain>.localhost.com" 
path = "https://stackoverflow.com/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'意味着什麼?

+0

訪問是有效的,爲什麼是你的主機「本地主機。 com「? – Vanwaril 2011-02-19 13:17:14

回答

4

SSL通過檢查主機的證書來驗證主機的有效性。

每個證書可以是:

  1. 自簽名
  2. 通過其他證書籤名。

如果它由另一個證書籤名,它會檢查簽名它的證書。

現在,在某些時候,要驗證證書是否有效,它必須將該證書與系統上存儲的「有效」證書存儲相匹配(例如:Firefox維護自己的存儲,Windows具有自己的商店等)。如果它與商店中的層次結構中的某個證書相匹配,那麼它會將該證書視爲有效,因此所有由其簽名的證書都是有效的。

但是,如果證書是自簽名的並且不在商店中,那麼它將拒絕它,或者警告您它無法驗證證書。

如果證書是用於測試應用程序,還是用於測試有限的規模部署,您可以要求人們將證書添加到他們的商店,這是沒問題的。但是,如果您打算將應用程序移至somedomain.com上的生產站點,那麼您可能需要爲該域購買證書。

注:在這兩種情況下,你有localhost的自簽名證書只爲「localhost」的,沒有哪怕是在Intranet上通過IP

+0

我更新了問題。 – user502052 2011-02-19 12:57:07

2

證書[在SSL]中的目的是證明主機是它聲稱的主機,而不是假的主機。要做到這一點,證書由證書頒發機構頒發,他們[應該正確]檢查請求證書的個人或組織的身份。因此,自簽名證書不能可靠地識別主機(即使它是本地主機)。因此,大多數應用程序在證書鏈中看到自簽名證書時會報告驗證錯誤。唯一的例外是[通常]當證書被明確地添加到系統中的私人證書列表中時 - 在這種情況下,它被接受爲有效。

因此,如果您在計算機上創建了用於測試目的的自簽名證書,則可以將其添加到受信任列表中。否則(如果您需要公共主機的證書),您需要從證書頒發機構之一購買證書。

+0

我更新了問題。 – user502052 2011-02-19 12:57:34