解决自签名证书HTTPS告警:强制使用SHA-256算法生成证书
解决自签名证书HTTPS告警:强制使用SHA-256算法生成证书
一、问题场景
在使用OpenSSL生成和配置自签名证书时,常遇到以下现象:
- 浏览器已正确导入根证书(
.pem
文件),但访问HTTPS站点时仍提示不安全连接或证书不可信告警。 - 经排查,操作步骤无误,但证书默认使用SHA-1哈希算法,而现代浏览器(如Chrome、Firefox)已逐步淘汰对SHA-1的支持,导致验证失败。
二、核心解决方案
强制使用SHA-256哈希算法生成证书,替换默认的SHA-1算法。具体操作如下:
在生成用户证书请求(CSR)、私钥及用户证书的命令中添加 -sha256
选项,确保证书链全流程使用SHA-256算法。
三、完整操作步骤与脚本
3.1 环境变量配置
CERT_CONFIG_PATH=/opt/secure # 证书配置文件路径
OUTPUT_CERT_PATH=/opt/cert/https # 证书输出路径
3.2 生成自签名根证书(仅需执行一次)
# 说明:生成根证书(CA证书),指定SHA-256算法(隐含在req命令中)
# 参数说明:
# - CN="xyzcom":证书通用名称(可自定义)
# - yourpassword:根证书加密口令
# - -rand /dev/urandom:指定随机数生成器(可选)
openssl req -config ca.cnf -x509 -keyout ${OUTPUT_CERT_PATH}/rootkey.pem -out ${OUTPUT_CERT_PATH}/root.pem \-newkey rsa:2048 -days 36500 -passout pass:yourpassword -rand /dev/urandom
- 生成文件:
root.pem
:根证书公钥(需导入浏览器信任列表)rootkey.pem
:根证书私钥(用于签发用户证书,需安全存储)
3.3 生成用户证书(含SHA-256关键参数)
3.3.1 清理旧证书(避免冲突)
rm -vf ${OUTPUT_CERT_PATH}/user.key ${OUTPUT_CERT_PATH}/user.csr ${OUTPUT_CERT_PATH}/keystore.p12
cd ${OUTPUT_CERT_PATH}
3.3.2 生成用户私钥和证书请求(含 -sha256
)
openssl req -new -nodes -keyout ${OUTPUT_CERT_PATH}/user.key -out ${OUTPUT_CERT_PATH}/user.csr \-config ${CERT_CONFIG_PATH}/ca.cnf -sha256 # 关键:指定SHA-256算法
-nodes
:私钥不加密(如需加密可移除该参数)-config ca.cnf
:使用自定义配置文件(见下文)
3.3.3 用根证书签名用户证书(含 -sha256
)
openssl x509 -req -in ${OUTPUT_CERT_PATH}/user.csr -CA ${CERT_CONFIG_PATH}/root.pem -CAkey ${CERT_CONFIG_PATH}/rootkey.pem \-CAcreateserial -out ${OUTPUT_CERT_PATH}/user.crt -days 36500 -extfile ${CERT_CONFIG_PATH}/extension.cnf \-passin pass:yourpassword -sha256 # 关键:指定SHA-256算法
-passin pass:yourpassword
:根证书私钥口令(与生成根证书时一致)
3.3.4 生成PKCS12格式证书(用于Tomcat等服务器)
openssl pkcs12 -export -in ${OUTPUT_CERT_PATH}/user.crt -inkey ${OUTPUT_CERT_PATH}/user.key \-out ${OUTPUT_CERT_PATH}/keystore.p12 -name tomcat -passout pass:X10086
-passout pass:X10086
:PKCS12文件加密口令
四、配置文件详解(ca.cnf)
HOME = .
RANDFILE = $ENV::HOME/.rnd
SN = "Not Defined"
CN = "zdycom" # 根证书默认通用名称
default_ca = ca[ req ]
default_bits = 2048 # 密钥长度
default_keyfile = privkey.pem
prompt = no # 禁止交互式提问
distinguished_name = req_distinguished_name
x509_extensions = usr_cert # 用户证书扩展配置
string_mask = utf8only # 字符集限制[ req_distinguished_name ]
countryName = CN # 国家代码
stateOrProvinceName = Shanghai # 省/市
localityName = Shanghai # 地区
organizationName = bk # 组织名称
organizationalUnitName = spiderx # 部门名称
commonName = $ENV::CN # 动态获取通用名称(需与证书域名一致)
serialNumber = $ENV::SN # 证书序列号[ usr_cert ]
basicConstraints = critical, CA:FALSE # 标识非CA证书
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
nsComment = "spiderx Generated Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid[ v3_ca ]
# 根证书扩展配置(生成根证书时使用)
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always
basicConstraints = critical, CA:true
keyUsage = critical, cRLSign, keyCertSign[ca]
database = index.txt # 证书索引数据库
crlnumber = crlnum.txt # 吊销列表编号
五、注意事项
- 根证书更新:
若更换根证书(rootkey.pem
/root.pem
),需重新生成所有用户证书(user.crt
),否则旧证书将无法通过新根证书验证。 - 浏览器导入:
- 根证书(
root.pem
)需导入系统或浏览器的受信任的根证书颁发机构列表。 - 不同浏览器路径不同(如Chrome:设置 → 隐私和安全 → 安全 → 证书 → 受信任的根证书颁发机构)。
- 根证书(
- 算法兼容性:
部分旧系统可能不支持SHA-256,需根据环境调整(但强烈建议优先使用SHA-256)。
六、总结
通过在OpenSSL命令中显式添加 -sha256
选项,可确保自签名证书使用现代加密算法,解决浏览器因SHA-1弃用导致的HTTPS告警问题。关键在于全流程强制使用SHA-256,并正确配置证书链信任关系。该方案已在实际项目中验证有效,可快速应用于各类需要自签名证书的场景(如本地开发、测试环境)。