簡體   English   中英

如何向LiClipse添加證書以允許通過SSL訪問git repo?

[英]How can I add a certificate to LiClipse to permit access to a git repo via SSL?

當我嘗試在https://git.ffmpeg.org/ffmpeg.git上從LiClipse到受SSL保護的git repo進行交互時,我得到一個對話,內容為:

提供有關https://git.ffmpeg.org/ffmpeg.git的信息

無法建立與https://git.ffmpeg.org/ffmpeg.git的安全連接,因為無法驗證服務器的證書。

報告了SSL:PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到到請求目標的有效證書路徑

您要跳過此服務器的SSL驗證嗎?

跳過此git操作的SSL驗證[]

跳過SSL驗證以進行存儲庫/my/workspace/ffmpeg/.git []的git操作

從現在開始[],始終跳過此服務器的SSL驗證

  [Cancel] [OK] 

因此,我知道LiClipse使用Eclipse插件EGit處理git pull請求,並且EGit通過安裝的Java機器滿足了該請求。 我不清楚EGit是使用作為Eclipse一部分安裝的Java機器,還是使用安裝在主機OS上的Java機器。 我知道我是否放置了從主機( https://git.ffmpeg.org/ )檢索到的SSL證書文件所在的目錄或其他位置。

證書去向哪里? 如何根據LiClipse或Eclipse安裝的內容以及主機OS上的Java實用程序確定它?

如何從git服務器檢索適當的證書? 可能以某種方式使用我的瀏覽器,或者可能是一些我將URL或域名傳遞給它的命令行實用程序,但那又是什么呢? 證書很可能是自簽名的,這對事情有什么影響?

如何將從服務器檢索的證書轉換為LiClipse或Eclipse可以使用的格式? 我運行一些Java證書實用程序嗎?

如何將轉換后的證書安裝到正確的位置?

我對Java的SSL和證書處理的術語和體系結構不熟悉,因此請解釋首字母縮寫詞和/或指向適當的概述文檔。

我正在Mac OS X El Capitan 10.11.6上使用基於Eclipse平台4.7.1.v20170906-1700的LiClipse 4.3.1.201711062215。

以下是一些相關的頁面,這些頁面可能會給出部分答案,但是假定我沒有Java架構的知識,或者適用於其他基於Java的系統,這些系統不是Eclipse,Egit和LiClipse。

從這個問題中問號的數量可以看出,在這種情況下,需要將幾條知識連接在一起才能形成答案。 盡管有些(LiClipse)晦澀難懂,但有些(Java的keytool)在難以找到的文檔中得到了解答,所有這些都不困難。

診斷

首先進行一些解釋。 Eclipse主要是Java語言代碼,它在JRE(Java運行時環境)上運行 “ SSL”是指通信協議 后來將其重命名為“ TLS”,但是在這里我將使用“ SSL”。 事實證明,SSL通信是由JRE處理的:“ PKIX”指的是一個工作組,該工作組提出了SSL使用的證書系統,而“ sun.security.provider ”指示Java SE Security體系結構正在處理Java的安全性。通訊。

SSL安全性的一部分是對您進行身份驗證,即當您要求連接到某個特定的互聯網站點(例如“ git.ffmpeg.org”)時,您實際上是在訪問該站點,而不是冒名頂替者。 證書 ”是一小塊數據,用於標識目標名稱,並通過發布該證書的服務通過數字簽名證明該數據的正確性。 如果您信任頒發者,並且證書上的簽名是有效的,則可以信任生成的證書中的內容。 發行服務本身具有證書,由其自己的發行服務依次簽名。 證書以“ 信任鏈 ”鏈接到其發行者。 某些證書和某些頒發者將鏈固定下來。 這就是所謂的“根證書”。

JRE在JRE信任庫中包含幾個根證書的副本。 它存儲在JRE的Java Home目錄內的文件中,位於./lib/security/cacerts )。 JRE還包括工具./bin/keytool ,該工具./bin/keytool從信任./bin/keytool中添加和刪除證書。 但是JRE並不包含所有重要的根證書。

錯誤對話告訴我們,LiClipse和EGit要求JRE的安全代碼將信任鏈中的證書連接到git.ffmpeg.org服務器的證書,再連接到JRE Trust Store中的某些證書​​。 這失敗了,因為信任庫缺少必要的證書。 解決方案是將git.ffmpeg.org的證書添加到本地JRE信任庫。 JRE的keytool將允許我們添加它。 (如果您相信服務器根證書后面的人只有經過認證的優秀演員證書,則可以改為從以服務器證書結尾的信任鏈中添加根證書。如果您的賭注很高,則可能應該獲得一個在信任之前,比僅此博客文章更好的安全性簡介。)

因此,我們需要做的是:

  1. 獲取目標服務器git.ffmpeg.org的SSL證書,或該鏈的根證書
  2. 標識LiClipse使用的JRE及其Java主目錄的位置
  3. 了解如何在該JRE中使用keytool
  4. 在該JRE中找到信任庫
  5. 使用keytool將新的SSL證書添加到LiClipse JRE的信任庫中
  6. 測試更改是否有效

獲取SSL證書

首先,我們獲得目標服務器git.ffmpeg.org的SSL證書。 或者,我們可以從服務器證書的信任鏈中獲取根“證書頒發機構”(CA)證書。 如果獲得服務器的證書,則僅將該服務器標記為受信任。 如果獲得了CA根證書,則可以將任何具有直接或間接從該CA頒發的證書的服務器使用,這可能是更多的服務器。 但是,也許您不信任每個CA所做的一切。 進行權衡不屬於這些說明的范圍。

獲取目標服務器的SSL證書的一種直接方法是通過OpenSSL命令行工具。

% openssl s_client -connect git.ffmpeg.org:443 </dev/null 2>/dev/null >cert.crt

(詳細信息: openssl s_client是SSL / TLS協議客戶端的參考實現,可正確與服務器通信並有助於診斷。s_client從stdin讀取HTTP命令,因此“ </dev/null ”表示法使stdin成為空文件。“ 2>/dev/null ”表示會丟棄stderr的所有輸出,因此它不會在常規輸出中混淆。-connect選項的參數是主機名':',端口名。端口443是https協議的標准端口。來源: SuperUser答復 。)

這會將目標服務器的證書存儲在文件cert.crt 大小約為2182字節左右。 它看起來像這樣:

-----BEGIN CERTIFICATE-----
MIIGBDCCBOygAwIBAgISA/dw6A9zk496P+FouEc0W3OyMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
... [ 29 lines omitted ] ...
7U4xF6Csg3X76Xx35kIVO/JJOhoDbGIydD1Cya7dba9ZhNFa+KU1uiyu5AX+i4fd
bCXI4Ukqzwc=
-----END CERTIFICATE-----

或者,您可以使用Firefox Web瀏覽器(v 57或更高版本)下載目標服務器的證書。 導航至https://git.ffmpeg.org 按照Mozilla的說明查看站點的證書

  1. 單擊位置欄左側的“(i)”圖標,然后單擊右箭頭,然后單擊“安全”選項卡,然后單擊“查看證書”按鈕。 出現證書查看器。
  2. 單擊“詳細信息”選項卡。
  3. 在頂部窗格的“證書層次結構”中,單擊服務器的底部條目或根目錄的頂部條目。
  4. 然后單擊“導出...”按鈕。 出現“文件保存”對話框,文件名以“ .crt”結尾。
  5. 保存包含證書的文件,可以在某個位置訪問。

在Chrome和Safari上, 似乎無法下載證書本身 ,但是您可以獲得具有證書信息文本文件,該文件可讀但不可重用。

根CA證書更難獲得。 openssl s_client-showcerts選項將打印出信任鏈。 與文檔的主張相反 ,這只是服務器發送的證書。 服務器通常不在其信任鏈的根部發送根CA證書。 (請參見OpenSSL問題s_client -showcerts man文本引起誤解:“鏈中的所有證書” ,#4933 。)但是,此選項的確會在根CA證書上打印出名稱。 它是服務器發送的最終證書的頒發者。

% openssl s_client -connect git.ffmpeg.org:443 -showcerts </dev/null 2>/dev/null 
CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=ffmpeg.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIGBDCCBOygAwIBAgISAzCih69KsBB6DxJc3koSpgrMMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
... [ 29 lines omitted ] ...
Gi010DGiJpnEM3LIcrsokySWppACKkBCcEW3dlAL/kX+8CQrtT+ns8OtAC2RYuMF
jGjs0Nphih0=
-----END CERTIFICATE-----
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
... [ 29 lines omitted ] ...
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
---

根CA證書標識為:“ /O=Digital Signature Trust Co./CN=DST Root CA X3 ”。

有幾個地方可以查找根CA證書的集合。 每個瀏覽器都包含其信任的證書的集合,並且可能可以通過該集合找到文件。 但是,我發現最容易的來源是MacPorts將證書與openssl一起安裝。 它們位於OpenSSL數據位置中,該位置是將該位置編譯到OpenSSL中的目錄。 查找一個名為cert.pem的文件和一個名為cert /的目錄。 (有關更多信息,請參閱Paul Heinlein的《 OpenSSL可以識別哪些證書頒發機構?》 。)在我的計算機上,它看起來像:

% openssl version -d OPENSSLDIR: "/opt/local/etc/openssl"

要列出OpenSSL信任的所有證書文件的路徑,可以使用此命令。 (來源:我對StackOverflow上如何列出受OpenSSL信任的證書的回答 )。

% find -H `openssl version -d | sed -E 's/OPENSSLDIR: "([^"]*)"/\1/'`/(cert.pem|certs) \
-type f -exec ls -l {} \+
lrwxr-xr-x  1 root  admin  40 29 Nov 02:05 /opt/local/etc/openssl/cert.pem -> /opt/local/share/curl/curl-ca-bundle.crt

(如果要對證書文件進行其他操作,則可以在上面的“ ls -l {} ”中使用其他命令。)因此,這表明我的OpenSSL安裝重用了curl-ca-bundle.crt查看該文件,我看到它用我在服務器證書的/ CN字段中看到的相同名稱標記了每個證書。 此命令使用grep查找並打印該證書。 您可以省略-text選項以在開始時保留文本版本:

% find -H `openssl version -d | sed -E 's/OPENSSLDIR: "([^"]*)"/\1/'`/(cert.pem|certs) \
-type f -exec grep -B 1 -A 19 'DST Root CA X3' {} \+ | openssl x509 -text
Certificate:
... [ 4 lines omitted ] ...
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=Digital Signature Trust Co., CN=DST Root CA X3
        Validity
            Not Before: Sep 30 21:12:19 2000 GMT
            Not After : Sep 30 14:01:15 2021 GMT
        Subject: O=Digital Signature Trust Co., CN=DST Root CA X3
        Subject Public Key Info:
... [ 45 lines omitted ] ...
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
... [ 11 lines omitted ] ...
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

從“ --BEGIN CERTIFICATE-- ”行到“ --END CERTIFICATE-- ”行的證書文本是根CA證書,您可以選擇將其安裝在LiClipse中。 要將該部分僅放入文件中,請從上述命令中刪除-text選項,然后將結果通過管道DST Root CA X3.crt到名稱為“ DST Root CA X3.crt ”的文件中。

識別LiClipse JRE

證書安裝在LiClipse使用的Java運行時環境(JRE)中 下一個任務是識別此JRE及其Java主目錄的位置。

幸運的是, LiClipse(對於Mac)是否包括其自己的JRE副本? 在堆棧溢出中得到了回答 是的,Mac版LiClipse 確實包含其自己的JRE。 Java主目錄位於應用程序捆綁包內的./jre/Contents/Home中。 ./bin子目錄具有可執行文件,例如主java可執行文件。

% cd /Applications/LiClipse\ 4.0.0/LiClipse.app/jre/Contents/Home
% ls -F
COPYRIGHT               THIRDPARTYLICENSEREADME.txt     man/
LICENSE                 Welcome.html                release
README                  bin/
THIRDPARTYLICENSEREADME-JAVAFX.txt* lib/
% bin/java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

LiClipse JRE的鍵盤工具

Java JRE包含一個命令行實用程序keytool ,用於管理該JRE的密鑰。 該實用程序位於JRE的./bin/keytool中。 您可以通過閱讀keytool文檔了解更多信息 您還可以使用其-help選項運行keytool,並閱讀keytool手冊頁(使用“ man -M man/ ”獲取JRE的手冊頁,而不是系統的手冊頁。)而且,盡管許多關於keytool的網頁都假定Windows並說“ keytool.exe”,在Mac上您當然不使用“ .exe”擴展名。

% cd /Applications/LiClipse\ 4.0.0/LiClipse.app/jre/Contents/Home
% man -M man/ keytool
... [man page omitted] ...
% bin/keytool -help
Key and Certificate Management Tool
... [20 lines omitted] ...
Use "keytool -command_name -help" for usage of command_name

此密鑰工具是我們用來將密鑰添加到信任庫的工具。

LiClipse JRE的信任庫

JRE將在各個位置查找密鑰。 默認值為~/.keystore ,它是與當前用戶綁定的位置,該用戶的所有JRE都可以查詢該位置。 默認情況下,此位置沒有任何內容。 后備位置位於JRE的Java Home目錄下,該文件為./lib/security/cacerts

這些位置是有關Java安全性體系結構的一個較大故事的一部分,在這里我不會贅述。 您可以通過閱讀keytool文檔條款部分Java密碼體系結構(JCA)參考指南來開始學習它。 您將看到與“信任存儲”相關的術語“密鑰存儲”。 有時,這些術語可以互換使用。 就我們的目的而言,“信任存儲”是正確的術語。

方便的選擇是修改JRE的本地信任庫。 路徑在上方。 keytool文檔cacerts部分告訴我們其初始密碼為“ changeit ”。 對於LiClipse JRE,可能仍然是其密碼。

將新的根證書添加到LiClipse JRE的信任庫中

剩下的就是將這些部分放在一起。 使用keytool將新的服務器SSL證書或根CA證書添加到LiClipse JRE的信任庫中。

% cd /Applications/LiClipse\ 4.0.0/LiClipse.app/jre/Contents/Home
% bin/keytool -import -alias FFmpeg.org -file cert.crt -keystore lib/security/cacerts -storepass changeit
Owner: CN=ffmpeg.org
Issuer: CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US
Serial number: 3f770e80f73938f7a3fe168b847345b73b2
Valid from: Tue Oct 31 23:22:03 PDT 2017 until: Mon Jan 29 22:22:03 PST 2018
Certificate fingerprints:
     MD5:  61:57:B5:6B:56:08:B9:ED:E8:EC:EC:85:A9:CA:1A:F4
     SHA1: 75:1B:86:CD:1E:34:7C:13:2F:49:E2:6D:73:A0:4F:05:09:11:7B:72
     SHA256: EB:FA:E4:3F:CB:22:31:9F:97:7B:FA:E4:79:D6:90:7F:E0:20:3E:DA:E8:6F:C3:F0:38:55:F7:C0:1E:0D:6A:33
     Signature algorithm name: SHA256withRSA
     Version: 3
....
Trust this certificate? [no]:  yes
Certificate was added to keystore

通過閱讀手冊頁,可以清楚地看到keytool的調用。 概括一下: -import命令-import添加證書, -alias為存儲中的證書提供標題, -file提供從中讀取證書的-keystore的路徑, -keystore提供密鑰庫的路徑(不帶)它,將使用默認的~/.keystore ),而-storepass給出該密鑰庫的密碼。 您可以添加選項-noprompt以減少該工具的注釋,並添加選項-trustcacerts以停止有關信任證書的問題,但是對於這種用途,我喜歡進行交叉檢查。

如果您願意,則相同的調用將導入根CA證書。

測試

接下來,我們測試該更改是否有效。 嘗試再次在LiClipse下使用EGit從ffmpeg.org執行“ git pull”。 這次,沒有錯誤對話框出現。 這表示JRE的安全代碼,用於將信任鏈中的證書從git.ffmpeg.org服務器的證書連接到JRE信任庫中的某些證書​​。 (如果您在JRE信任庫中安裝了服務器的證書,則該證書為1證書鏈。)

注意

這是關於如何向LiClipse添加SSL證書以允許EGit訪問git repo (我寫過關於該主題的博客文章)的簡述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM