openssl

そこそこ楽にオレオレ証明書を発行する (ECDSA)

More than 3 years have passed since last update.

ECDSAなオレオレ証明書を発行するのってどうやるんだろう?と思って調べた。

鍵の作成、自己署名証明書の発行コマンドは http://qiita.com/Hexa/items/c677871bfc0a682d0de1 で丁寧に説明されていた。

これをワンライナで実現するためにはどうすればいいだろうと調べていたところ、 -newkey ec:<(openssl ecparam -name prime256v1) みたいな書き方が出来るみたいだったので、以下のようにしてみた。

COMMON_NAME=localhost

openssl req \
-newkey ec:<(openssl ecparam -name prime256v1) \
-sha256 \
-keyout $COMMON_NAME.key \
-nodes \
-x509 \
-out $COMMON_NAME.crt \
-days 365 \
-subj "/C=JP/ST=/L=/O=/OU=/CN=$COMMON_NAME"

これを実行すると、秘密鍵とオレオレ証明書のセットが生まれる。

$ openssl req \

> -newkey ec:<(openssl ecparam -name prime256v1) \
> -sha256 \
> -keyout $COMMON_NAME.key \
> -nodes \
> -x509 \
> -out $COMMON_NAME.crt \
> -days 365 \
> -subj "/C=JP/ST=/L=/O=/OU=/CN=$COMMON_NAME"
Generating a 256 bit EC private key
writing new private key to 'localhost.key'
-----
No value provided for Subject Attribute ST, skipped
No value provided for Subject Attribute L, skipped
No value provided for Subject Attribute O, skipped
No value provided for Subject Attribute OU, skipped

鍵と証明書の中身はこんな感じ。

Signature Algorithm が ecdsa-with-SHA256 になっていることが分かる。

$ openssl ec -in localhost.key -noout -text

read EC key
Private-Key: (256 bit)
priv:
00:aa:9b:c8:1b:9e:91:a0:78:17:54:c2:db:9d:62:
af:98:e5:a2:33:fe:ac:e6:d4:3b:8e:bc:d0:aa:a4:
34:47:6e
pub:
04:3f:d8:71:a3:ec:7e:b6:68:14:50:a7:07:3e:2e:
34:9b:8d:f1:59:39:f0:4d:ea:f0:40:3b:be:3b:0d:
5b:21:51:7b:9a:ec:a9:56:03:25:73:26:69:89:a1:
4b:91:ce:ce:7a:ef:b6:23:1b:e4:1b:fa:ae:cc:2a:
46:76:aa:8d:54
ASN1 OID: prime256v1
NIST CURVE: P-256

$ openssl x509 -in localhost.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 17279496450991085047 (0xefcd1a78b2f255f7)
Signature Algorithm: ecdsa-with-SHA256
Issuer: C=JP, CN=localhost
Validity
Not Before: Jul 25 12:31:41 2015 GMT
Not After : Jul 24 12:31:41 2016 GMT
Subject: C=JP, CN=localhost
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:3f:d8:71:a3:ec:7e:b6:68:14:50:a7:07:3e:2e:
34:9b:8d:f1:59:39:f0:4d:ea:f0:40:3b:be:3b:0d:
5b:21:51:7b:9a:ec:a9:56:03:25:73:26:69:89:a1:
4b:91:ce:ce:7a:ef:b6:23:1b:e4:1b:fa:ae:cc:2a:
46:76:aa:8d:54
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Subject Key Identifier:
26:59:9F:B4:7B:89:BA:67:10:1E:F2:A1:9C:3F:88:36:19:85:F0:50
X509v3 Authority Key Identifier:
keyid:26:59:9F:B4:7B:89:BA:67:10:1E:F2:A1:9C:3F:88:36:19:85:F0:50

X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: ecdsa-with-SHA256
30:46:02:21:00:c4:7e:e9:10:5f:ef:59:b3:23:e1:4e:15:16:
66:b7:13:65:8d:ed:7e:81:88:93:a8:1c:22:bf:87:0d:31:21:
19:02:21:00:83:b0:c0:0f:c5:26:90:bd:9d:7d:31:3c:4f:09:
a9:61:da:f2:eb:2b:7d:dc:31:23:26:95:dd:3d:b0:ec:70:42


ブラウザでの表示確認

こんな感じの nginx.conf を用意し、 nginx -c /path/to/nginx.conf で起動する。

worker_processes 1;

daemon off;

events {
worker_connections 1024;
}

http {
access_log /dev/stdout;
error_log /dev/stderr debug;

server {
listen 4443;

ssl on;
ssl_certificate localhost.crt;
ssl_certificate_key localhost.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
}

https://localhost:4443 にアクセスすると、(もちろん Trusted では無いのでバツマークは出るけど、)ECDSAによる証明書であることが分かる。

Kobito.ABETEW.png

以上、簡単なお試しでした。