在<Git Server on Windows 安裝手記>中,我整理了在 Windows 環境上安裝 Apache HTTP Server 和 Git for Windows 的操作步驟。這篇則是要讓 Git(其實主要是 Apache)支援 HTTPS 加密協定。也就是說,連同這篇的設定,你的 Git 伺服器就能夠同時支援 HTTP 和 HTTPS 啦!
操作步驟如下:
Step 1: 修改 Apache 組態
用文字編輯器開啟 Apache 的組態檔 httpd.conf,分別找到底下這兩行設定,並將前面的 '#' 字元刪除(也就是取消註解)。
第二行表示要加入 conf\extra\httpd-ssl.conf,故接著要開啟這個組態檔,確認其中包含以下設定:
注意最後兩行的 server.crt 和 server.key。下個步驟就是要產生這兩個檔案。
Step 2: 建立憑證和金鑰
開啟命令列視窗,將現行目錄切換至 Apache 的安裝目錄下的 bin。然後依序輸入以下指令(你的 Apache 必須是內建 OpenSSL 的版本):
第一道指令會要求你輸入一些基本資料,如國家代碼、城市、電子郵件信箱等等。參考下圖:
最後一道指令的 "-days 3650" 參數,是指定這個伺服器憑證的有效期限為十年。
若上述指令都執行成功,應該會在 bin 目錄下產生三個檔案,分別是 server.csr、server.key、和 server.crt。
將 server key 與 server.crt 搬移至 Apache 的 conf 目錄下,然後重啟 Apache 服務。
Step 3: 修改 Git 參數
開啟 Git Bash,輸入以下指令:
這個指令要在用戶端電腦執行。也就是說,每個要透過 https 協定存取版本庫的用戶端電腦都要先下這個指令。少了這個步驟,在執行 git clone 命令來取出版本庫時,很可能會出現錯誤訊息:
或出現另一種錯誤:
我試過網路上找到的幾種解法,最後發現還是把 http.sslverify 參數設為 false 這個方法最為簡單有效。
測試看看
現在你的 Git 伺服器應該可以同時支援 HTTP 和 HTTPS 了。你可以開啟 Git Bash,然後用 git clone 測試看看,例如:
或使用加密協定:
直接指定帳號密碼:
最後,別忘了防火牆要開放 TCP 443 port 喔!
參考資料
操作步驟如下:
Step 1: 修改 Apache 組態
用文字編輯器開啟 Apache 的組態檔 httpd.conf,分別找到底下這兩行設定,並將前面的 '#' 字元刪除(也就是取消註解)。
#LoadModule ssl_module modules/mod_ssl.so #Include conf/extra/httpd-ssl.conf
第二行表示要加入 conf\extra\httpd-ssl.conf,故接著要開啟這個組態檔,確認其中包含以下設定:
.... Listen 443 .... SSLMutex default .... <virtualhost _default_:443=""> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" ServerName localhost:443 ServerAdmin 你的電子郵件信箱 .... SSLEngine on .... SSLCertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server.crt" SSLCertificateKeyFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server.key" .... </virtualhost>
注意最後兩行的 server.crt 和 server.key。下個步驟就是要產生這兩個檔案。
Step 2: 建立憑證和金鑰
開啟命令列視窗,將現行目錄切換至 Apache 的安裝目錄下的 bin。然後依序輸入以下指令(你的 Apache 必須是內建 OpenSSL 的版本):
openssl req -config ..\conf\openssl.cnf -new -out server.csr openssl rsa -in privkey.pem -out server.key openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
第一道指令會要求你輸入一些基本資料,如國家代碼、城市、電子郵件信箱等等。參考下圖:
最後一道指令的 "-days 3650" 參數,是指定這個伺服器憑證的有效期限為十年。
若上述指令都執行成功,應該會在 bin 目錄下產生三個檔案,分別是 server.csr、server.key、和 server.crt。
將 server key 與 server.crt 搬移至 Apache 的 conf 目錄下,然後重啟 Apache 服務。
Step 3: 修改 Git 參數
開啟 Git Bash,輸入以下指令:
$ git config --global http.sslverify false
這個指令要在用戶端電腦執行。也就是說,每個要透過 https 協定存取版本庫的用戶端電腦都要先下這個指令。少了這個步驟,在執行 git clone 命令來取出版本庫時,很可能會出現錯誤訊息:
error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify faile d while accessing https://localhost/Projects/test/info/refs fatal: HTTP request failed
或出現另一種錯誤:
error: error setting certificate verify locations: CAfile: \bin\curl-ca-bundle.crt CApath: none while accessing https://localhost/Projects/test/info/refs
我試過網路上找到的幾種解法,最後發現還是把 http.sslverify 參數設為 false 這個方法最為簡單有效。
測試看看
現在你的 Git 伺服器應該可以同時支援 HTTP 和 HTTPS 了。你可以開啟 Git Bash,然後用 git clone 測試看看,例如:
$git clone http://michael@localhost:8080/Projects/Test
或使用加密協定:
$git clone https://michael@localhost/Projects/Test
直接指定帳號密碼:
$git clone https://michael:密碼@localhost/Projects/Test
最後,別忘了防火牆要開放 TCP 443 port 喔!
參考資料
請教先進,依照前一篇到這篇要開啟HTTPS但到這一段無法啟動APACHE服務,提示the requested operation has failed
回覆刪除另外在前一篇中,如果沒有在最後一段開始前先輸入 Alias /git "D:/GitRepos" 後續會無法顯示
是否因為http-conf設置轉向,導致HPPTS 也有問題啊
可否請大大幫忙回答
Hello! "the requested operation has failed" 多半是因為 Apache 的 config 檔案內容有錯所致。可以逐步移除掉一些可疑的組態設定來找出有問題的設定,或者以命令列的方式啟動 Apache,也可以找出錯誤的地方(指令可參考這篇: http://www.linuxidc.com/Linux/2010-05/26203.htm)
回覆刪除