文档中心
Linux鑷SSL璇佷功濡備綍鍙樹负鍙俊浠伙紵涓€姝ユ鏁欎綘鎼炲畾浼佷笟绾у畨鍏ㄩ厤缃?txt
时间 : 2025-09-27 16:24:34浏览量 : 4
为什么需要自签SSL证书?

在日常开发和内部系统部署中,我们经常遇到需要使用HTTPS的场景,但又不方便或没必要购买商业CA颁发的SSL证书。这时自签SSL证书就派上用场了。
举个实际例子:假设你正在为公司开发一个内部使用的财务系统,这个系统只在公司内网使用,不对外公开。为了数据传输安全,你需要启用HTTPS。如果去买商业证书:
1. 花钱(虽然不多但没必要)
2. 申请流程麻烦
3. 每年都要续期
这种情况下,自签SSL证书就是最佳选择!但问题是:浏览器会显示"不安全"警告,如下图:

就是要教你如何让这个自签名证书被系统和浏览器信任。
基础概念:CA与信任链
要理解如何让自签证书被信任,首先得明白CA(Certificate Authority,证书颁发机构)和信任链的概念。
想象一下现实生活中的身份证:
- 公安局就是"CA"
- 你的身份证就是"证书"
- 别人相信你的身份证是真的,是因为他们信任公安局
在计算机世界也一样:
- Windows/MacOS/Linux和浏览器内置了受信任的CA列表
- 这些CA颁发的证书会自动被信任
- 自签证书就像你自己做的"身份证",别人当然不认
所以要让系统信任我们的自签证书,我们需要:
1. 自己扮演CA
2. 用这个CA签发服务器证书
3. 让系统/浏览器信任我们这个"山寨CA"
Linux下创建自签名CA和证书的完整流程
第一步:创建自己的根CA(Certificate Authority)
```bash
创建私钥 - 这是最重要的部分,必须严格保护!
openssl genrsa -des3 -out myRootCA.key 2048
用私钥创建根证书
openssl req -x509 -new -nodes -key myRootCA.key -sha256 -days 3650 -out myRootCA.pem
```
执行后会让你填写一些信息:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Inc.
Organizational Unit Name (eg, section) []:IT Department
Common Name (eg, YOUR name) []:My Company Root CA
Email Address []:admin@mycompany.com
关键点解释:
- `myRootCA.key`是你的根私钥文件,相当于公安局的印章
- `myRootCA.pem`是根证书文件,可以分发给需要验证的人/设备
- `-days 3650`设置10年有效期(内部使用可以设长些)
- Common Name(CN)要明确表明这是根CA
第二步:用这个根CA签发服务器证书
现在我们来为内部网站`finance.internal.mycompany.com`创建SSL证书:
1. 创建服务器私钥:
openssl genrsa -out finance.internal.mycompany.com.key 2048
2. 创建CSR(Certificate Signing Request):
openssl req -new -key finance.internal.mycompany.com.key -out finance.internal.mycompany.com.csr
填写信息时特别注意Common Name必须是域名:
Common Name (eg, YOUR name) []:finance.internal.mycompany.com
3. 准备扩展配置文件`finance.internal.mycompany.com.ext`:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = finance.internal.mycompany.com
DNS.2 = finance.mycompany.com
如果有多个域名可以这样添加更多SANs(Subject Alternative Names)
4. 用根CA签发服务器证书:
openssl x509 -req -in finance.internal.mycompany.com.csr \
-CA myRootCA.pem \
-CAkey myRootCA.key \
-CAcreateserial \
-out finance.internal.mycompany.com.crt \
-days 825 \
-sha256 \
-extfile finance.internal.mycompany.com.ext
现在你得到了三个关键文件:
- `finance.internal.mycompany.com.key`:服务器私钥(保密!)
- `finance.internal.mycompany.com.crt`:服务器公钥证书(配置到Web服务器)
- `myRootCA.pem`:根证书(需要导入到客户端)
Linux系统中将根证书设为可信的三种方法
方法一:Ubuntu/Debian系统
sudo cp myRootCA.pem /usr/local/share/ca-certificates/myCompanyRootCA.crt
sudo update-ca-certificates
验证是否成功:
```bash
awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | grep "My Company"
方法二:CentOS/RHEL系统
sudo cp myRootCA.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
验证命令相同。
方法三:手动管理NSS数据库(适用于Firefox等)
Firefox不使用系统的证书存储,而是有自己的NSS数据库:
certutil -A -n "My Company Root CA" \
-t "CT,C,C" \
-i myRootCA.pem \
-d sql:$HOME/.pki/nssdb
Chrome/Chromium也可以使用这个方式
certutil -L -d sql:$HOME/.pki/nssdb
查看已安装的证书记录列表
Web服务器配置示例
Nginx配置示例:
```nginx
server {
listen 443 ssl;
server_name finance.internal.mycompany.com;
ssl_certificate /path/to/finance.internal.mycompany.com.crt;
ssl_certificate_key /path/to/finance.internal.mycompany.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
...其他配置...
}
Apache配置示例:
```apacheconf
ServerName finance.internal.mycompany.com
SSLEngine on
SSLCertificateFile /path/to/finance.internal.mycompany.com.crt
SSLCertificateKeyFile /path/to/finance.internal.mycompany.com.key
重启服务后访问网站应该不再显示安全警告!
Windows客户端导入根证书记录的方法
对于公司内Windows电脑访问你的内部网站:
1. 双击`.pem`文件
2. 选择"安装证书记录">"本地计算机"
3. 选择"将所有证书记录放入下列存储">"受信任的根证书记录颁发机构"
4. 完成导入
验证方法:
certmgr.msc > Trusted Root Certification Authorities > Certificates > My Company Root CA是否存在?
MacOS客户端导入方法
2. 钥匙串访问中选择"系统"(不是登录钥匙串)
3. 找到导入的证书记录右键>显示简介>始终信任
Android设备导入方法
设置 > Security > Encryption & credentials > Install a certificate > CA certificate
然后选择你导出的`.pem`文件
iOS设备导入方法
通过邮件发送`.pem`文件给自己
在iPhone上打开邮件附件
按照提示安装profile
QA常见问题解答
Q: Chrome还是显示不安全怎么办?
A: Chrome缓存较顽固,尝试以下步骤:
1) chrome://flags/
allow-insecure-localhost Enabled
2) chrome://restart
3) chrome://net-internals/
hsts删除该域名记录
Q: Firefox单独不认怎么办?
A: Firefox使用自己的NSS数据库参考上文方法三处理
Q: curl/wget等命令行工具还是不认怎么办?
A: Linux下可以添加参数临时忽略或全局添加环境变量支持
临时忽略验证(不安全):
curl --insecure https://your.site
wget --no-check-certificate https://your.site
```
全局添加支持(推荐):
编辑/etc/environment添加:
CURL_OPTIONS="--cacert /etc/ssl/certs/myCompanyRootCa.crt"
WGET_OPTIONS="--ca-certificate=/etc/ssl/certs/myCompanyRootCa.crt"
REQUESTS_OPTIONS="{'verify': '/etc/ssl/certs/myCompanyRootCa.crt'}"
export CURL_OPTIONS WGET_OPTIONS REQUESTS_OPTIONS
Q: Java应用不认怎么办?
A: Java有自己独立的cacerts存储库需要单独导入
查找JAVA_HOME位置然后执行:
```bash
keytool.exe \
importcert \
alias "MyCompanyCARoot"\
file myRootCa.pem \
keystore "$JAVA_HOME/lib/security/cacerts"\
storepass changeit
默认密码是changeit
```
PKI最佳实践建议
虽然自签名方案解决了燃眉之急但在企业环境中建议考虑以下进阶方案提升安全性
1.搭建企业内部PKI架构(适合大型企业):
微软AD CS、EJBCA等开源解决方案
可以实现自动颁发和吊销管理
2.使用Let's Encrypt私有PKI(适合中小企业):
https://smallstep.com/docs/tutorials
3.定期轮换密钥(重要!):
即使内部使用也应每6个月更换一次密钥
HTTPS安全加固补充建议
除了解决证书记录问题外还应该做以下加固措施
1.禁用老旧协议和弱加密套件
Nginx示例配置片段
```nginx
ssl_protocols TLSv1 TLSv1 TLSv TLSv;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256...';
```
2.启用HSTS头强制HTTPS(生产环境谨慎评估后开启):
add_header StrictTransportSecurity "max-age=63072000; includeSubDomains; preload";
3.定期扫描检查:
https://www.ssllabs.org/ssltest/index.html
通过本文你已经掌握了从零开始建立企业内部可信HTTPS环境的完整技能包括
?? OpenSSL生成根证书记录和签发子证书记录的方法
?? Linux各发行版安装可信根证书记录的技巧
?? Windows/MacOS/iOS/Android各平台客户端的适配方案
?? Web服务器的具体配置实例
?? HTTPS加固的最佳实践
把这些知识应用到你的企业环境中就能构建既安全又经济的HTTPS基础设施而不再受限于商业SSL证书记录的高成本和繁琐流程
TAG:Linux自签ssl证书变为可信任,aws的证书,aws certified证书,aws证书查询,aws ssl证书,aws资格认证,aws certification,aws证书含金量,aws证书有什么用,aws证书有效期