SSLのクライアント証明書の扱いについて誤解を正して貰えて有難かった話
SSLのクライアント証明書を使って接続相手の認証まで行いたいケースで、 クライアント証明書が self signed certificate だと危ないのでは?という疑問を呟いたら @satoh_fumiyasu
さんに突っ込んでもらえて、私の誤解を正してもらえました。…誤解したままだったら…と考えると、肝が冷えます。さとうさん、有難うございました。
.oO(…SSLのクライアント証明書って、オレオレにしちゃったら、認証として全く意味が無くなると思うのだけど、違うのかしら?…)
— hkoba (@hkoba) 2017年10月4日
違いますね。
— ふみやす@シェルまおう(自称でない)🚲 (@satoh_fumiyasu) 2017年10月5日
むむむ?どんな使い方だと、オレオレなクライアント証明書でも安全になるのでしょう?
— hkoba (@hkoba) 2017年10月5日
サーバーへのログインユーザ名にクライアント証明書の CN を使うというケースだと、他の人が勝手に同じ CN でオレオレ証明書を作って接続してきても、通ってしまうのでは、と思うのです…
当然、条件はあります。要は相手が示した証明書の署名が、自分の信頼している CA の証明書で発行したもの(かつ期限内、CRL などに載ってない)であればいいわけですから。オレオレ証明書でも同じです。
— ふみやす@シェルまおう(自称でない)🚲 (@satoh_fumiyasu) 2017年10月5日
認証する側が自己署名証明書を信頼している (信頼する CA 証明書として設定してある) なら大丈夫だったかと。実装や証明書に付与した何かしらの制約(constraints)に依るかも。
— ふみやす@シェルまおう(自称でない)🚲 (@satoh_fumiyasu) 2017年10月5日
なるほど、該当 self-signed cert 自体をサーバー側に信頼する CA として登録する、と…
— hkoba (@hkoba) 2017年10月5日
確かにそこまですれば、別人が勝手に同じ CN の証明書で繋げてきても拒否できますね。
ありがとうございます~
その後、実際に postgresql で試してみた所、CNだけ同じの成り済ましクライアント証明書で接続した時はこんなエラーが出る、と確認できました。
psql: SSLエラー: tlsv1 alert unknown ca
じこひはん
クライアント側も CA として扱う、という発想が出てこなかったのが、自分の頭の硬い所だったなぁと。お互いがお互いを Certificate Authority として信頼する…おお、peer to peer だ。どうも私の発想はサーバーに偏りすぎてたようです…