web-dev-qa-db-ja.com

特定のhttpsリモートの特定の自己署名サーバー証明書を受け入れるようにGitを構成する

私が取り組んでいるプロジェクトのシステム管理者は、SSHが「面倒すぎる」と判断しました。代わりに、彼はGitをhttps:// URL(およびユーザー名/パスワード認証)経由でアクセスできるように設定しています。このURLのサーバーは自己署名証明書を提示するため、証明書の検証を無効にするように全員にアドバイスしました。これは、セキュリティの観点から見れば、良いセットアップではありません。

GitにリモートX(または、https://$SERVERNAME/で始まるリポジトリのリモート)に対して、特定の証明書を受け入れること、およびのみその証明書を伝えることは可能ですか?基本的に、SSHのサーバーキーの動作を二重化します。

136
zwol

簡単に:

  1. 自己署名証明書を取得する
  2. いくつかの(例えば~/git-certs/cert.pem)ファイルに入れます
  3. http.sslCAInfoパラメーターを使用して、この証明書を信頼するようにgitを設定します

より詳しく:

リモートサーバーの自己署名証明書を取得する

サーバーのURLはrepos.sample.comであり、ポート443を介してアクセスするとします。

取得方法には複数のオプションがあります。

OpenSSLを使用して証明書を取得する

$ openssl s_client -connect repos.sample.com:443

出力をファイルcert.pemにキャッチし、-BEGIN CERTIFICATE--END CERTIFICATE-の間(および含む)を除くすべてを削除します。

結果のファイル〜/ git-certs/cert.pemの内容は次のようになります。

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Webブラウザーを使用して証明書を取得する

RedmineをGitリポジトリで使用し、Web UIとgitコマンドラインアクセスに同じURLにアクセスします。この方法では、そのドメインの例外をWebブラウザーに追加する必要がありました。

Firefoxを使用して、Options -> Advanced -> Certificates -> View Certificates -> Serversに行き、そこで自己署名ホストを見つけ、それを選択し、Exportボタンを使用して、opensslを使用して作成したものとまったく同じファイルを取得しました。

注:私は少し驚いた、目に見える言及された権限の名前がない。これは結構です。

信頼できる証明書を専用ファイルに入れます

前の手順では、証明書を何らかのファイルに含める必要があります。ドメインにアクセスするときにgitから見える限り、どのファイルでも構いません。 ~/git-certs/cert.pemを使用しました

注:より信頼できる自己署名証明書が必要な場合は、同じファイルに入れてください:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

これは機能します(ただし、単一の証明書でのみテストしました)。

この証明書を信頼するようにGitを構成する

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

また、--systemの代わりに--globalを使用して、そのシステム全体を実行することもできます。

それをテストしてください:これで、以下に頼ることなくサーバーと通信できるようになります:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

すでにSSL証明書を無視するようにgitを設定している場合は、設定を解除します。

$ git config --global --unset http.sslVerify

また、スペルミスをせずにすべて正しく行ったことを確認することもできます。

$ git config --global --list

すべての変数をリストするものは、グローバルに設定しました。 (httpをhttにスペルミスしました)。

255
Jan Vlcinsky

aeminium.orgのこのページ によると、http.sslCAInfoまたはhttp.sslCAPath構成アイテムを.git/configに追加する必要があります。これには、Webサーバーの証明書が含まれます。

6
Rudi

OSXユーザー調整。

受け入れられた答えの手順に従うと、OSXでの構成時に少し追加されました。

Cert.pemファイルをOSXにログインしているユーザーの下のディレクトリに配置したため、信頼できる証明書の場所を調整しました。

この証明書を信頼するようにgitを構成します。

$ git config --global http.sslCAInfo $ HOME/git-certs/cert.pem

1
Chris Langston