解決自簽名證書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,并正確配置證書鏈信任關系。該方案已在實際項目中驗證有效,可快速應用于各類需要自簽名證書的場景(如本地開發、測試環境)。