2015-05-14 107 views
1

我正在通過域列表循環查看a)是否有443個偵聽器和b)收集ssl證書過期,簽名算法和公用名。所有擁有443監聽器的域名都會報告正確的SSL證書(與Chrome報告相匹配),但是,有一個域名無法正確報告 - myproair.com會爲parkinsonsed.com報告證書 - 任何想法?OpenSSL :: X509 ::顯示錯誤域證書的證書

# ssl cert lookup 
    begin 
    timeout(1) do 
     tcp_client = TCPSocket.new("#{instance["domain"]}", 443) 
     ssl_client = OpenSSL::SSL::SSLSocket.new(tcp_client) 
     ssl_client.connect 
     cert = OpenSSL::X509::Certificate.new(ssl_client.peer_cert) 
     ssl_client.sysclose 
     tcp_client.close 
     #http://ruby-doc.org/stdlib-2.0/libdoc/openssl/rdoc/OpenSSL/X509/Certificate.html 
     date = Date.parse((cert.not_after).to_s) 
     row.push("#{date.strftime('%F')} #{cert.signature_algorithm} #{cert.subject.to_a.select{|name, _, _| name == 'CN' }.first[1]}".downcase.ljust(57)) 
    end 
    rescue SocketError 
    row.push("down".ljust(57)) 
    rescue Errno::ECONNREFUSED 
    row.push("connection refused".ljust(57)) 
    rescue Errno::ECONNRESET 
    row.push("connection reset".ljust(57)) 
    rescue Timeout::Error 
    row.push("no 443 listener".ljust(57)) 
    rescue Exception => ex 
    row.push("error: #{ex.class}".ljust(57)) 
    end 

更新:這是我的工作版本:

$ ruby --version 
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14] 

$ openssl version 
OpenSSL 0.9.8zc 15 Oct 2014 

我驗證了SNI擴展在ClientHello使用發送OpenSSL的s_client-connect-tls1-servername選項。

+0

OpenSSL的0.9。 8只支持TLS 1.0(而不是1.1或1.2)。您應該自己構建OpenSSL,並將其安裝在'/ usr/local'或'/ usr/local/ssl'中,並儘可能使用它。例如,你可以從命令行運行'/ usr/local/ssl/bin/openssl s_client ...'。請參閱OpenSSL wiki上的[編譯和安裝](http://wiki.openssl.org/index.php/Compilation_and_Installation)。我編寫了Mac OS X指令,所以我知道它們的工作原理。 – jww

+0

相關:[Ruby OpenSSL :: SSL :: SSLContext SNI servername_cb Not Working](http://stackoverflow.com/q/30238304)。 – jww

回答

1

但是,有一個域不能正確報告 - myproair.com,它報告parkinsonsed.com的證書 - 任何想法?

它看起來像共享主機結合SSL是罪魁禍首。顯然,parkinsonsed.com是服務器的默認站點。

您應該使用SNI來克服這些限制。 SNI可用於TLS 1.0及以上版本。另請參閱Server Name Indication support in Net::HTTP?


myproair.com,與SSLv3和無SNI

$ openssl s_client -ssl3 -connect myproair.com:443 | openssl x509 -text -noout | grep -A 1 -i name 
... 
X509v3 Subject Alternative Name: 
    DNS:parkinsonsed.com, DNS:www.parkinsonsed.com, DNS:test.parkinsonsed.com, DNS:dev.parkinsonsed.com 

myproair.com,使用TLS 1.0和SNI

$ openssl s_client -tls1 -connect myproair.com:443 -servername myproair.com | openssl x509 -text -noout | grep -A 1 -i name 
... 
X509v3 Subject Alternative Name: 
    DNS:myproair.com, DNS:www.myproair.com, DNS:dev.myproair.com, DNS:test.myproair.com 
+0

感謝您的見解,@jww。我追加了OpenSSL :: SSL :: SSLSocket#hostname =「#{instance [」domain「]}」。new(tcp_client),我得到一個NoMethodError。我有OpenSSL 0.9.8zc 2014年10月15日和ruby 2.0.0p481(2014-05-08修訂版45883)[universal.x86_64-darwin14] –

+0

我證實我從TLS 1.0和SNI的命令示例中獲得了正確的SNI響應。現在我只是想弄清楚如何在上面的Ruby例子中設置適當的選項。 –

+1

感謝您的反饋,我已關閉並在此處打開一個新問題http://stackoverflow.com/questions/30244745/ruby-opensslsslsslcontext-sni-servername-cb-not-working –