エンジニアが英語できるようになりたい

年末休み二日目だし tls と遊ぶ

Created: 2017-12-30

まずは以下のコマンドのエラーから考えたい。

$ curl https://localhost:18443
curl: (60) SSL certificate problem: Invalid certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

オレオレ証明書をつかって、ローカルに http.ListenAndServerTLS で待ち構えるサーバを立てています。 なので、上のようなエラーがでています。

なので、以下のようにすれば大丈夫です。

$ curl --cacert ca.crt https://localhost:18443
<html><body>hello sam smith</body></html>

ちゃんとエラーを読めるようになると楽しいですね。英語の勉強にもなるし。

curl performs SSL certificate verification by default, using a “bundle” of Certificate Authority (CA) public keys (CA certs).

curl は SSL 証明書の確認に、デフォルトでは “bundle” of CA certs を使う。

CA certs の束があるんですね?どこにあるんだろう。

そして、その bundle が不十分な場合は、 --cacert オプションを使って明示してね。ということですね。 なので、上のように明示したわけであります。

bundle of CA certs がきになるけど

$ openssl version -d
OPENSSLDIR: "/System/Library/OpenSSL"

見てもよくわからないし、

$ ll /etc/ssl
total 240
drwxr-xr-x   5 root  wheel     170  9 18 02:06 .
drwxr-xr-x  92 root  wheel    3128 11 29 11:44 ..
-rw-r--r--   1 root  wheel  227344  2 10  2017 cert.pem
-rw-r--r--   1 root  wheel     745 10 21  2016 openssl.cnf
-rw-r--r--   1 root  wheel    1006 10 21  2016 x509v3.cnf

この辺をみてもよくわかんらない…。 cert.pem のことかな?とも思うのですが、違うっぽくて、いまいちわからない。

それでも CA certs bundle を探すと以下の記事で、 stracedtruss というコマンドに出会いました。 https://serverfault.com/questions/485597/default-ca-cert-bundle-location

たが、しかし、出会っただけで、結局記事中にあるようにエラーが出てまたどん詰まり状態になった。

ちょっとあきらめるか。

Chrome に 自作の ca.crt を登録したい

ca.cert を chrome に登録しても NET::ERR_CERT_COMMON_NAME_INVALID となってします。 これは次の記事に詳しく解説されています。 https://tech.torico-corp.com/blog/chrome58-https-ssl-cert-san-error/ X509v3 Subject Alternative Name: を設定する必要があるようです。

https://superuser.com/questions/1202498/create-self-signed-certificate-with-subjectaltname-to-fix-missing-subjectaltnam この記事は知見の予感があります。

まずは、エラーが

NET::ERR_CERT_AUTHORITY_INVALID に変わりました。もう少しな気がする。

あらためて、

chrome 環境設定 > 詳細設定 > HTTPS / SSL の証明書と設定を管理します

という流れから ca.crt を キーチェーン: ログイン 分類: 証明書 に登録したらいけました。

長かったなぁ。わからないことがいっぱいだなぁ。 でも無事に、ローカルサーバで 緑の鍵マークが見れてよかったです。