当前位置: 首页 > java >正文

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

五、注意事项

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

六、总结

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

http://www.xdnf.cn/news/8042.html

相关文章:

  • openCV1-2 图像的直方图相关
  • 微服务架构中的 RabbitMQ:异步通信与服务解耦(二)
  • SQLMesh 宏操作符详解:提升 SQL 查询的灵活性与效率
  • Spring Boot与Eventuate Tram整合:构建可靠的事件驱动型分布式事务
  • 高等数学-积分
  • ElasticSearch操作
  • HarmonyOS 鸿蒙应用开发基础:父组件调用子组件方法的几种实现方案对比
  • HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析
  • HarmonyOS实战:高德地图自定义定位图标展示
  • Redis 5.0.10 集群部署实战(3 主 3 从,三台服务器)
  • 深度学习模型部署:使用Flask将图像分类(5类)模型部署在服务器上,然后在本地GUI调用。(全网模型部署项目步骤详解:从模型训练到部署再到调用)
  • RAGFlow知识检索原理解析:混合检索架构与工程实践
  • Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的管理与运营策略研究
  • 格雷希尔快速封堵接头,解决新能源汽车的气密性检测和三电系统的综合测试
  • java 基础知识巩固
  • 深度解析:Spark、Hive 与 Presto 的融合应用之道
  • SpringBoot Day_03
  • Docker 与微服务架构:从单体应用到容器化微服务的迁移实践
  • 谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA
  • 基于STM32F4的cubemx关于RTC配置说明
  • Docker架构详解
  • Win 系统 conda 如何配置镜像源
  • 【二刷力扣】【力扣热题100】今天的题目是:两数之和
  • Spring核心原理:动态数据源切换的企业级解决方案
  • springboot03
  • MqSQL
  • Oracle 11G RAC重启系统异常
  • WPF读取json文件,用到combox控件
  • 设计双向链表--LeetCode