Press "Enter" to skip to content

[笔记] 自签发证书

最近需要往Pi上安置一个Web服务器来进行管理,遂希望给它整个TLS证书。

常规使用

生成CA密钥,-aes128 -passout stdin参数会要求输入密码加密CA密钥,不建议去除
$ openssl genrsa -aes128 -passout stdin 4096 > ca.key
生成CA证书(把请求的生成合并了)
$ openssl req -new -x509 -key ca.key -days 365 -out ca.crt
生成服务器密钥
$ openssl genrsa 4096 > server.key
生成服务器的签名请求,会自动要求你填写很多信息,如果不想填这么多的话可以加个参数-subj "/C=二位国家代号/CN=FQDN"
$ openssl req -new -key server.key -out server.csr
签名,生成证书;-set_serial 1 这个数字可以随便填,只是一个标识符
$ openssl x509 -req -days 365 -out server.crt -in server.csr -CA ca.crt -CAkey ca.key -set_serial 1

生成CA证书时把FQDN填成服务器名也能直接用,就不需要两个证书。

颁发对IP的证书

但是你会发现往FQDN直接填IP居然没有用!因为如果是给IP地址颁发证书,IP是要写在主机别名上的。

生成服务器的签名请求,一样可以用-subj简短输入
$ openssl req -new -key server.key -addext "subjectAltName = IP:IP地址,DNS:域名地址,..."
一样地签名生成证书,但要加上参数-copy_extensions=copyall来复制这个附加字段
$ ...

但是,这里有个陈年老坑,那就是签名时不会自动把附加字段写进证书,也不支持-copy_extensions参数(新版支持了)。如果你的发行版不是滚得比■■■■还快,那我推荐你自己把openssl clone下来自己构建一遍。