Real World HTTP 第2版の5章を読んだ
の続編
Real World HTTP 第2版 ―歴史とコードに学ぶインターネットとウェブ技術
を買ったマスタカです
6章 Go言語によるHTTP1.1クライアントの実装
を読んだので新しく知ったことをまとめる
Goと言いながらOpenSSLの説明だったので案外役に立った
・OpenSSLでパスの確認方法
openssl version -d
OPENSSLDIR: “/private/etc/ssl”
・openssl.cnf
Basic Constraints: CA証明書かどうかを示す多値の拡張設定
pathlenは証明書チェーン内でこのCAに連なることができるCAの最大数を示す。したがって、pathlen:0のCAはエンドユーザー証明書への署名しかできず、他のCAに署名することはできない。
中間認証局を使うと時に数字が変わるっぽい
https://qiita.com/3244/items/8c7e6892efdb4e500be9
CA証明書: 電子証明書を発行する認証局自身の公開鍵が含まれた電子証明書。
https://www.geotrust.co.jp/support/glossary/ca_certificate.html
Key Usage:鍵の用途
Encipherment 鍵暗号
https://www.trustss.co.jp/smnSignature350.html
serverAuth SSL/TLS Webサーバ認証
clientAuth SSL/TLS Webクライアント認証
つまりCA用として使えるようにするための拡張設定は基本制約basicConstraints = CA:trueで、鍵の用途keyUsage = cRLSign, keyCertSignを追加する意味は、他の用途で使えなくすることでした。
https://qiita.com/3244/items/2a2a2dc6cd1e2e35beb9
CSR証明書署名要求、サーバ証明書発行の際に必ず必要となる、証明書署名要求と呼ばれるものです。 CSRはお客様のサーバ上で生成するもので、生成したCSRを認証機関に提出すると、認証機関がこれに署名をして、サーバ証明書を発行します。
http://www.comodo.jp/beginner/csr.html
・証明書の作り方
CA秘密鍵
CA秘密鍵から証明書要求CSRを作成
CSRファイルとは、SSL通信に利用する公開鍵暗号系の公開鍵に、コモンネームなどの情報を付加したものです。
CA証明書を自分の秘密鍵で署名してcrtを作成
CRTファイルとは、SSL証明書会社がCSRファイルに情報を付加して秘密鍵で暗号化したものです。サーバ証明書などとも呼ばれます。
サーバー秘密鍵
サーバー秘密鍵からサーバーCSRを作成
サーバーCSRとCA証明書とCAの秘密鍵からサーバー証明書を作成
https://install-memo.hatenadiary.org/entry/20110906/1315291837
・GolangでSSL
サーバーをGolangで作る
err := http.ListenAndServeTLS(":18443", "../ssl/server.crt", "../ssl/server.key", nil)
クライアントをcurlで実施
何もつけないとエラー
curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.haxx.se/docs/sslcerts.html
以下だとうまくいく
curl https://localhost:18443 --cacert ca.crt
クライアントをGolangで作る
509にしてPemでcertを読み込んでTlsClientConfigにくっつける
cert, err := ioutil.ReadFile("../ssl/ca.crt") if err != nil { panic(err) } certPool := x509.NewCertPool() certPool.AppendCertsFromPEM(cert) tlsConfig := &tls.Config{ RootCAs: certPool, } tlsConfig.BuildNameToCertificate() client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConfig, }, }
クライアントで普通に実行すると動かない
そのため、実行時に環境変数つける
env GODEBUG=x509ignoreCN=0 ./http
TLSやらOpenSSLは全然理解してなかったのでとても勉強になりました
まだまだ続くよ