其实之前就已经发现有这个问题,突然用本地调试的时候就提示证书无效,之前用的还好好的,也没有多想什么。今天刚好需要做新的项目,由于项目本身走全站HTTPS,为了能更快发现掺杂的非HTTPS资源,因此想要在本地配置一个自签名证书,发现怎么配置都不对,由于还忘记了当时配置自签名证书的方法,因此搞了好久,为了防止忘记,特地记录一下。
我看了很多关于自签名的文章,去找签名方法,但配置到apache中总会报错启动失败,这是由于签发的证书真是自签名证书,其实没有CA签名过程,具体看下例:
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
使用的是server.key签名server.csr生成server.crt文件,之前没有发现到,其实这个流程本身有点奇怪,因为本身自签名就不是认证的合法签名,这样签名之后生成的是一个CA签名,而不是域名签名。然而我老是用这种方式进行域名签名,死活不行也是很正常的。
因为我之前已经生成过ROOT CA,因此我只需要生成一个私钥、对应的证书请求文件、并使用ROOT CA生成签名证书就可以了,生成ROOT CA的方式如上面所述,在此就不在阐述
openssl x509 -res -days 3650 -in reqFile -CA caCrtFile -CAkey caPrivateKeyFile -CAserial caSerialFile -out outCrtFile
其实一句话就可以对reqFile签名,但这种方式从Chrome58之后就不能再骗过Chrome浏览器了,会提示证书无效,也就是第一句话所说的问题。找到一篇日志解决此问题: https://medium.com/@kennychen_49868/chrome-58%E4%B8%8D%E5%85%81%E8%A8%B1%E6%B2%92%E6%9C%89san%E7%9A%84%E8%87%AA%E7%B0%BD%E6%86%91%E8%AD%89-12ca7029a933 原因及解决方法讲的很清楚,可以阅读链接文章,在此直接贴解决方案
只需要再创建一个extFile 具体内容为:
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost
签名的命令行中多加一个参数 -extfile extfilePath
openssl x509 -res -days 3650 -in reqFile -CA caCrtFile -CAkey caPrivateKeyFile -CAserial caSerialFile -extfile extFile -out outCrtFile
签名之后的证书就可以让Chrome重新显示绿锁。