web-dev-qa-db-ja.com

cURLコマンドラインで自己署名証明書を信頼する方法は?

このMakefileを使用して、 Let's Encryptの推奨事項 を使用して、foo.localhostの自己署名証明書を作成しました。

_include ../.env

configuration = csr.cnf
certificate = self-signed.crt
key = self-signed.key

.PHONY: all
all: $(certificate)

$(certificate): $(configuration)
    openssl req -x509 -out $@ -keyout $(key) -newkey rsa:2048 -nodes -sha256 -subj '/CN=$(HOSTNAME)' -extensions EXT -config $(configuration)

$(configuration):
    printf "[dn]\nCN=$(HOSTNAME)\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:$(HOSTNAME)\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth" > $@

.PHONY: clean
clean:
    $(RM) $(configuration)
_

次に、それをWebサーバーに割り当てました。サーバーが関連する証明書を返すことを確認しました:

_$ openssl s_client -showcerts -connect foo.localhost:8443 < /dev/null
CONNECTED(00000003)
depth=0 CN = foo.localhost
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = foo.localhost
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=foo.localhost
   i:/CN=foo.localhost
-----BEGIN CERTIFICATE-----
[…]
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=foo.localhost
issuer=/CN=foo.localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1330 bytes and written 269 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: […]
    Session-ID-ctx: 
    Master-Key: […]
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    […]

    Start Time: 1529622990
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
    Extended master secret: no
---
DONE
_

/ etcで何も変更せずにcURLにを信頼させるにはどうすればよいですか? _--cacert_は機能しません機能しませんおそらくCAがないためです:

_$ curl --cacert tls/foo.localhost.crt 'https://foo.localhost:8443/'
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
_

目標は、開発中にHTTPSを有効にすることです。

  • すべての開発環境でDNS検証を有効にするための多くの作業なしに、完全に本番に似た証明書を作成することはできません。したがって、私は自己署名証明書を使用する必要があります。
  • 開発環境をできる限り本番環境に近づけたいのは明らかなので、証明書の問題をすべて無視することはできません。この場合、_curl -k_はcatch (Exception e) {}に似ています。ブラウザがWebサーバーと通信するようなものはまったくありません。

つまり、_curl [something] https://project.local/api/foo_を実行するときは、

  1. tLSが適切に設定されている場合自己署名証明書がある場合を除くコマンドは成功し、
  2. tLS構成に問題がある場合自己署名証明書がある場合を除くコマンドは失敗します。

HTTPまたは_--insecure_を使用すると、2番目の基準が失敗します。

11
l0b0

これらの手順に従うと、問題が解決します。

  1. 自己署名証明書をダウンロードして保存します:echo quit | openssl s_client -showcerts -servername "${API_Host}" -connect "${API_Host}":443 > cacert.pem
  2. curlクライアントにそれを伝えます:curl --cacert cacert.pem --location --silent https://${API_Host}

また、wgetを使用して証明書を無視することもできます:wget --no-check-certificate https://${API_Host}

3
Robert Brisita

-kをお試しください:

curl -k https://yourhost/

自己署名証明書を「受け入れる」必要があります

0
V13

自己署名証明書を含む信頼チェーンを持つことはnotです。その場合は、だれでも(作り上げられた)有効な信頼チェーンを提供できます。自己署名証明書が信頼チェーンに含まれている場合は、無視する必要があります。自己署名証明書は、ローカルディレクトリでのみ有効です(コンピューターの所有者によって制御されます)。サーバーに与えられる証明書は、自己署名証明書にチェーンする必要があります。

細部のほとんどを含まない一般的なガイド。

  • openssl s_clientコマンドの出力に2つのエラーが表示されています。

    verify error:num=20:unable to get local issuer certificate
    verify error:num=21:unable to verify the first certificate
    

    つまり、マシンのデフォルトの証明書ストアには、使用したWebサイトから提供されたチェーンを検証する証明書がありません。自己署名証明書と、Webサーバー用の証明書にチェーンされた証明書を含むディレクトリが必要です。

手順:

  1. 新しいディレクトリを(どこにでも)作成し、c_rehashスクリプトで処理し、opensslにそれを使用してオプション-CApath Directoryで証明書を検証するように指示できます。 -CApathオプションを使用しているときに両方のエラーがなくなるまで変更を加えます。

  2. Webサーバーのチェーン証明書を生成します。

  3. 次に、curlに証明書ディレクトリを次のように伝えます。

    curl --capath <dir>
    

    必要な他のすべてのオプション。

これで両方のエラーがクリアされます。

0
Isaac