解决自签名证书HTTPS告警:强制使用SHA-256算法生成证书

发布于:2025-05-23 ⋅ 阅读:(23) ⋅ 点赞:(0)

解决自签名证书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 # 吊销列表编号

五、注意事项

  1. 根证书更新
    若更换根证书(rootkey.pem/root.pem),需重新生成所有用户证书(user.crt),否则旧证书将无法通过新根证书验证。
  2. 浏览器导入
    • 根证书(root.pem)需导入系统或浏览器的受信任的根证书颁发机构列表。
    • 不同浏览器路径不同(如Chrome:设置 → 隐私和安全 → 安全 → 证书 → 受信任的根证书颁发机构)。
  3. 算法兼容性
    部分旧系统可能不支持SHA-256,需根据环境调整(但强烈建议优先使用SHA-256)。

六、总结

通过在OpenSSL命令中显式添加 -sha256 选项,可确保自签名证书使用现代加密算法,解决浏览器因SHA-1弃用导致的HTTPS告警问题。关键在于全流程强制使用SHA-256,并正确配置证书链信任关系。该方案已在实际项目中验证有效,可快速应用于各类需要自签名证书的场景(如本地开发、测试环境)。


网站公告

今日签到

点亮在社区的每一天
去签到