Skip to content

Latest commit

 

History

History
215 lines (162 loc) · 5.81 KB

cert-note.md

File metadata and controls

215 lines (162 loc) · 5.81 KB

証明書関連メモ

CA.pl

昔っからopensslパッケージについているCA.plで プライベートCA(オレオレ認証局)を作ってみるメモ。

CA.plのパス長いので、 aliasかPATHに追加するか、作業ディレクトリにsymlink。/usr/local/bin/CA.plとかにsymlinkでもいいね。

ln -sf /usr/lib/ssl/misc/CA.pl .

デフォルト設定: /etc/ssl/openssl.cnf

Ubuntuでの例

$ ls -la /etc/ssl/openssl.cnf /usr/lib/ssl/openssl.cnf
-rw-r--r-- 1 root root 10998 Dec 13  2018 /etc/ssl/openssl.cnf
lrwxrwxrwx 1 root root    20 Mar 22 20:42 /usr/lib/ssl/openssl.cnf -> /etc/ssl/openssl.cnf

configファイルは環境変数OPENSSL_CONFIGから得る。 ローカルにコピーして、 countryName_defaultとかを書き変える。

export OPENSSL_CONFIG="`pwd`/openssl.cnf"
$ ./CA.pl -newca
CA certificate filename (or enter to create)

Making CA certificate ...
====
openssl req  -new -keyout ./demoCA/private/cakey.pem -out ./demoCA/careq.pem
Generating a RSA private key
......................................................................................+++++
...........+++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Minato-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Iroiro Co
Organizational Unit Name (eg, section) []:Super Secret div.
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ tree demoCA/
demoCA/
|-- cacert.pem
|-- careq.pem
|-- certs
|-- crl
|-- crlnumber
|-- index.txt
|-- index.txt.attr
|-- index.txt.old
|-- newcerts
|   `-- 0F33CB476EB6FA690D14DAC7D00BD9D4D5ABAEE1.pem
|-- private
|   `-- cakey.pem
`-- serial

WindowsなんかでプライベートCAを簡単にインポートできるようにDER形式に変換したバージョンも作っておく。

openssl x509 -outform der -in cacert.pem -out cacert.der

ふつうにサイト証明書つくってみる.

mkdir cert1
cd cert1
../CA.pl -newreq
# commonNameだけはちゃんと書くこと
cp newreq.pem ..
cd ..

./CA.pl -sign

newcert.pemが生成される。

serialが1個増える

$ git diff demoCA/serial
diff --git a/demoCA/serial b/demoCA/serial
index ceff5d6..791b9f4 100644
--- a/demoCA/serial
+++ b/demoCA/serial
@@ -1 +1 @@
-0F33CB476EB6FA690D14DAC7D00BD9D4D5ABAEE2
+0F33CB476EB6FA690D14DAC7D00BD9D4D5ABAEE3

$ openssl x509 -noout -in newcert.pem -serial
serial=0F33CB476EB6FA690D14DAC7D00BD9D4D5ABAEE2

サーバ証明書のシリアル番号を確認したい - UPKI-FAQ - meatwiki

mv newcert.pem cert1
rm newreq.pem

いやこれ面倒だな。カレントで作って、最後にpemを3つ移動とかがいいか?

クライアント証明書

オレオレ認証局でクライアント認証 ~ ウェブの Basic 認証をリプレース | OPTPiX Labs Blog

CA.plを使うなら

./CA.pl -newreq
./CA.pl -sign
./CA.pl -pkcs12

newcert.p12ができる。

PKCS#12形式証明書に関するコマンド - Qiita

で、これを使ってみるnginx + curlで。

curl用にpem形式のクライアント証明書curl.pemを作る。

openssl pkcs12 -in newcert.p12 -out curl.pem -nodes -clcerts

で、

curl -E ./curl.pem {URL}

みたいに。

nginx側はいろいろあるけど、「特定のディレクトリ以下をクライアント証明が必要」にしてみる

# -*- mode: nginx -*-

# ssl_verify_client on;
ssl_verify_client optional;
ssl_client_certificate {CA.plで作ったcacert.pemへのパス};

location /clientauth/ {
  if ($ssl_client_verify != SUCCESS) {
    return 403;
    # ほんとうは 400 Bad Request - No required SSL certificate was sent と返すべき
  }
  alias /somewhere/clientauth/;
  index index.htm;
}

ssl_client_certificate はサイトごとに1つしかもてないみたい。

mutual TLS authentication

mutual TLS(mTLS または 2way TLS)

【図解】mutual-TLS (mTLS, 2way TLS),クライアント認証とトークンバインディング over http | SEの道標

AWS Lambdaで

秘密鍵からパスフレーズを取り除く - Qiita