題 如何在本地將遠程服務器SSL證書保存為文件


我需要下載遠程服務器的SSL證書(不是HTTPS,但SSL握手應該與Google Chrome / IE / wget相同,並且curl都會給出證書檢查失敗錯誤)並在我的筆記本電腦Windows中添加證書。證書商店,因為我無法讓我的IT人員給我CA證書。

這是辦公室通信,所以我不能真正使用實際客戶獲得證書。

我如何做到這一點,我有Windows 7和一堆Linux很方便,所以任何工具/腳本語言都可以。


273
2018-01-18 07:43


起源


獲得證書 郵件服務器,見 security.stackexchange.com/questions/70528/... - That Brazilian Guy


答案:


如果您有權訪問OpenSSL,請嘗試

openssl s_client -connect {HOSTNAME}:{PORT} -showcerts

用您的值替換{HOSTNAME}和{PORT}。


263
2017-08-17 07:20



我更喜歡這個選項,因為我不需要打開GUI,我可以通過SSH從我們的服務器上完成。 - bramp
此外,它適用於HTTP以外的協議。 - matt
elec3647的解決方案 完全自動化在shell管道中提取PEM。 - phs
443是HTTPS的默認端口。 - Flimm
我需要 -servername 獲取虛擬主機證書的選項。 gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971 - Artistan


獲取證書的快速方法是運行以下命令,該命令將-showcerts的輸出傳遞給x509 ssl命令,該命令只刪除所有無關的內容。例如:

openssl s_client -showcerts -connect server.edu:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

要使用證書,請使用wget,

wget https:/server.edu:443/somepage --ca-certificate=mycertfile.pem

191
2017-09-05 13:47



我嘗試了這個(在另一個網站上) - 但是預計完整的證書鏈:似乎只帶回了鏈中的第一個 - 這是預期的嗎? - monojohnny
這對我不起作用:無法加載證書27262:錯誤:0906D06C:PEM例程:PEM_read_bio:無起始行:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c:648:期望:TRUSTED證書 - Janusz
我同意monojohnny,這並沒有給你完整的鏈條。 - Michael Munsey
晚了但是@monojohnny: openssl s_client -showcerts 顯示收到的鏈中的所有證書(如果連接成功),但是通過管道 openssl x509 只取第一個並丟棄其餘的。為了得到所有這些而不是使用 ...| sed -n '/^-----BEGIN CERT/,/^-----END CERT/p' 要么 ...| awk '/^-----BEGIN CERT/,/^-----END CERT/' 你也可以使用稍微複雜一些 awk 將每個證書放在一個單獨的文件中,使它們更容易使用 openssl 和其他一些工具。 - dave_thompson_085
要使用證書,請使用wget, wget https:/server.edu:443/somepage --ca-certificate=mycertfile.pem - MUY Belgium


說實話,我以前從未嘗試過這種方法(從不需要)但是,我剛剛在Firefox中試過,它似乎可以用於保存:

  1. 單擊頂部的SSL證書圖標/底部的掛鎖。
  2. 點擊 View Certificate
  3. 點擊 Details 標籤
  4. 從層次結構中選擇您想要的證書[未在圖片中圈出]
  5. 點擊 Export

alt text


114
2018-01-18 07:56



很高興知道 - 但為了我的好奇心,你能解釋一下你想要完成的事情嗎?我從來不需要導出SSL客戶端證書,我很好奇為什麼你真的需要這樣做... - William Hilsum
這是服務器證書,而不是客戶端證書。導出客戶端私鑰和證書的主要原因是維護備份,或者如果要使用其他瀏覽器或計算機進行身份驗證。 - gbroiles
@gbroiles - 讀了這個問題,他使用了錯誤的術語,但這解決了他的問題。 - William Hilsum
是的,我回答了你的問題 - 為什麼有人想保存客戶證書? “SSL客戶端證書”是你的用語,而不是他的用語。 - gbroiles
在Chrome中看起來沒有辦法做到這一點,對吧?! - fatuhoku


使用Chrome瀏覽器導出證書

  1. 使用SSL連接到網站(https://開頭什麼

2.單擊鎖定符號,然後單擊“詳細信息”

  1. 自Chrome版本56起,您可以執行以下操作: 轉到三點菜單 - >更多工具 - >開發人員工具,然後單擊安全選項卡。這會給你一個 安全概述 用一個 查看證書 按鈕。

  2. 點擊 查看證書 按鈕。

    將打開一個模態窗口。它有兩個窗格。頂部顯示了站點證書(列出的最後一個),中間證書和根證書(最頂層證書)的信任層次結構。

    第二個較大的窗格顯示其中一個證書的詳細信息。

    可能有零個或多個中間證書。

    請注意,根證書具有黃金邊框圖標。其他人有藍色邊框。

    請參見下面的屏幕截圖。

  3. 要導出證書:

    1. 首先單擊信任層次結構中的證書圖標。
    2. 證書將顯示在模態的主要部分。
    3. 單擊模態主要部分中的證書的大圖標。 拖動 桌面上的圖標。然後,Chrome會將證書複製到您的桌面。

enter image description here


41
2017-12-26 18:45



我不得不將圖標拖到文本編輯器上,桌面對我來說不起作用。 - Cory Klein
對於Windows上的Chrome,單擊“查看證書”後,模式與Mac不同。單擊Details選項卡,然後單擊Copy to File ...然後選擇格式和文件名,這很簡單。 - PolyTekPatrick
當我在Mac OS上使用Chrome v63時,我通過拖動證書獲得的文本文件是人類可讀的,但不是任何結構化格式,我可以弄清楚如何轉換為機器可讀的形式,如X.509 .crt。 - Jim DeLaHunt
如果從地址欄或從這個開發選項卡打開,沒有區別,仍然無法下載crt ... - user25


這是 gbroiles的回答,但我想指出cURL項目 有一個頁面,其中包含更多細節 在使用 openssl 保存遠程服務器的SSL證書:

  • openssl s_client -connect {HOSTNAME}:{PORT} | tee logfile
  • 類型 QUIT 然後按Enter / Return鍵。
  • 證書將列在“BEGIN CERTIFICATE”和“END CERTIFICATE”標記之間。
  • 如果要查看證書中的數據,可以使用:

    openssl x509 -inform PEM -in certfile -text -out certdata

    哪裡 certfile 是從中提取的證書 logfile。順便拜訪 certdata


18
2017-10-18 22:10



這對我有用。為了更明確一點,我編輯了logfile並修剪了BEGIN CERTIFICATE和END CERTIFICATE之外的所有內容,並將結果保存為certfile.pem(不確定是否需要擴展名)。 - Michael Welch


自動化

我需要-servername才能從我們服務器上的虛擬主機獲得正確的證書。

openssl s_client -showcerts -connect host.name.com:443 -servername host.name.com </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > host.name.com.pem

您也可以轉換為桌面證書

openssl x509 -inform PEM -in host.name.com.pem -outform DER -out host.name.com.cer

最後一部分是將它添加到您的證書,不確定在Windows上
對於我使用過的mac keychain,應該是類似的......

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain host.name.com.cer


9
2018-01-25 15:59



gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971 - Artistan


這將僅包含證書的結果

echo QUIT | \
openssl s_client -showcerts -connect hostname:port | \
awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}' "

1
2018-05-23 01:20