如何配置OpenSSL为指定域名设置不同的可信证书集合?
解决方案
核心思路
针对不同域名动态调整信任的证书集合:
- 对website1.com、website2.com、website3.com这三个域名,合并自定义证书和系统默认证书包作为验证依据
- 其他域名只使用系统默认证书包做验证
方案1:代码层面(适合自主开发的应用)
如果你的应用是基于OpenSSL API开发的,直接通过自定义证书存储和验证逻辑实现:
- 先加载Fedora 37的系统证书包到OpenSSL的证书存储:
X509_STORE *store = X509_STORE_new(); X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); // Fedora 37默认系统证书路径 X509_LOOKUP_load_file(lookup, "/etc/pki/tls/certs/ca-bundle.crt", X509_FILETYPE_PEM); - 判断当前访问的域名,如果是指定的三个,就把自定义证书也加到这个存储里:
// 假设domain是当前要访问的域名字符串 if (strcmp(domain, "website1.com") == 0 || strcmp(domain, "website2.com") == 0 || strcmp(domain, "website3.com") == 0) { X509 *custom_cert = PEM_read_X509_FILE("/path/to/your/custom_certs.crt", NULL, NULL, NULL); X509_STORE_add_cert(store, custom_cert); X509_free(custom_cert); } - 把这个配置好的证书存储关联到SSL上下文,后续的SSL连接就会用这个规则验证:
SSL_CTX_set_cert_store(ssl_ctx, store);
方案2:脚本封装(适合用现成工具访问的场景)
如果是用curl、wget这类工具访问不同域名,写个shell脚本做域名判断,动态指定CA证书:
- 保存下面的脚本(比如命名为
domain_access.sh):#!/bin/bash # 指定需要额外信任自定义证书的域名 TRUSTED_DOMAINS=("website1.com" "website2.com" "website3.com") # Fedora 37系统证书默认路径 SYSTEM_CA="/etc/pki/tls/certs/ca-bundle.crt" # 你的自定义证书路径 CUSTOM_CA="/path/to/your/custom_certs.crt" # 检查输入的域名是否在信任列表里 if [[ " ${TRUSTED_DOMAINS[@]} " =~ " $1 " ]]; then # 合并系统证书和自定义证书到临时文件 cat "$SYSTEM_CA" "$CUSTOM_CA" > /tmp/combined_ca.tmp # 用合并后的证书访问目标域名 curl --cacert /tmp/combined_ca.tmp "https://$1" # 清理临时文件 rm -f /tmp/combined_ca.tmp else # 其他域名直接用系统证书访问 curl "https://$1" fi - 给脚本加执行权限:
chmod +x domain_access.sh - 使用时直接传域名:
./domain_access.sh website1.com
注意点
- 确认Fedora 37的系统证书路径,如果你的系统有修改,可以用
openssl version -d查看默认配置目录,再找对应的CA文件。 - 代码方案里要记得释放证书对象和存储的内存,避免内存泄漏。
- 脚本里的临时文件用完就删,避免残留或被篡改。
内容的提问来源于stack exchange,提问作者socketpair
相关产品推荐
相关产品推荐

