使用OpenSSL颁发自签名证书的方法

可以从http服务器log看出尝试phpmyadmin密码的肉鸡多得很。我也在服务器上部署了phpmyadmin,为了安全想只让我的电脑能访问。于是使用了一个别人猜不到的域名作为virtual host的server name部署在http服务器上并在本机修改hosts文件使对于这个域名的访问指向我的服务器,这样就只能通过这个只有我知道的域名访问服务器才会展示phpmyadmin页面,十分安全。

为了进一步的安全就再加https。本来使用了默认选项且已把生成的CA添加到我电脑的受信任根证书中但浏览器还显示NET::ERR_CERT_COMMON_NAME_INVALID。然后才知道为了多域名的支持原来现在的浏览器已经不通过Common Name字段来判断证书是不是属于这个域名了,而是通过X509v3扩展中Subject Alternative Name字段来鉴别。一番摸索后总算成功了,看到左上角绿色图标后我欣慰地剥开一个橘子站着享用了。

记录流程以备后用:

1、为自己签发CA证书

首先生成CA证书私钥。之后服务器私钥生成也是用这个语句

openssl genrsa -out ca.key 2048

然后使用私钥生成CA证书。CA证书有效期通常很长,于是我也设了十年

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

运行上面语句后还会提示填写一些信息,随便填即可

生成完毕后不能忘了要把根证书安装到“受信任的根证书颁发机构”才能让本机对其下游证书可信

2、用CA证书签署网站证书

这步一样,先生成网站证书的私钥

openssl genrsa -out website.key 2048

随后生成csr请求文件

openssl req -new -key website.key -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.zhouii.com")) -out website.csr

这里的Common Name不能填写得和之前做CA证书的一样,否则会报错无法成功签发

Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2

不过坠吼的方法还是把 /etc/pki/CA 下index.txt.attr里的yes改为no以免后顾之忧

正式颁发证书激动人心的时刻

openssl ca -policy policy_anything -in website.csr -keyfile ca.key -cert ca.crt -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.zhouii.com")) -out website.crt
FAQ

(没人会frequently ask我的。。只是做的过程中自己产生的问题)
1、为何做csr文件和CA签署出crt时都需要SAN字段的配置文件?如果只有一个会怎样?

网上的教程清一色全是在两步都要使用带SAN的config,于是我亲身试毒。如果只在做csr时填,openssl在签署时会采用默认配置/etc/pki/tls/openssl.cnf中的X509配置,不会带有SAN字段,反而带有默认配置中的其他字段。

而如果只在CA签署时配置带SAN。。

AMAZING!出来的crt是带SAN字段的,放服务器上试验,浏览器也是能接受的!所以并不一定两步都要用带SAN的config,生成csr时只需使用如下语句,在最后CA签署时带SAN即可!

openssl req -new -key website.key -out website.csr

2、根据X509证书链规则,使用website.crt和website.key继续签发的证书是否有效。进一步,不是自签名的证书,买来的证书(可以被所有浏览器接受的)继续向下签发又是否有效呢?

如知后事如何,且听下回分解

//远程连接Linux编辑shell代码十分不方便,为了以后便捷使用,机智的我让代码块在网页上就可编辑我已经被我折服了,再站着吃个橘子压压惊

发表评论

电子邮件地址不会被公开。 必填项已用*标注

地方所限只列了这些常用的,但如果你打开例如https://tiny.zhouii.com/qqemoji/e888.gif发现不是404也可以手动加入[e888]之类的喔~