分类 ssl证书知识 下的文章

申请SSL证书时CSR文件的正确生成要点
CSR(Certificate Signing Request)是SSL证书申请的核心文件,其内容直接决定证书能否正确签发。以下从生成流程、常见错误和验证方法三个层面展开说明。

一、生成前的准备
使用OpenSSL生成CSR时,需确保以下字段准确:

字段 要求 常见错误
CN(Common Name) 必须与域名完全一致 填写IP地址或带www前缀不一致
O(Organization) 与营业执照一致 简写或拼写错误
OU(Organization Unit) 部门名称 留空或随意填写
C(Country) 两位国家代码 填写中文国名
关键原则:域名优先使用证书要保护的那个。 多域名证书的CSR中,CN填主域名,SAN字段补其余域名。

二、标准生成命令
bash
openssl req -new -newkey rsa:2048 -nodes \
-keyout private.key -out request.csr \
-subj "/C=CN/ST=Sichuan/L=Chengdu/O=公司全称/OU=IT部/CN=example.com"
若需指定SAN(Subject Alternative Name),建议先生成配置文件:

ini
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req

[dn]
C=CN
ST=Sichuan
L=Chengdu
O=公司全称
OU=IT部
CN=example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = api.example.com
再执行:

bash
openssl req -new -key private.key -out request.csr -config san.cnf
三、生成后的验证
不要生成完就直接提交。运行以下命令逐项检查:

bash
openssl req -text -noout -verify -in request.csr
重点确认:

verify OK 出现——说明CSR语法无问题
Subject中CN值 与目标域名逐字符匹配
X509v3 Subject Alternative Name 中包含所有需要保护的域名
私钥与CSR配对:openssl rsa -noout -modulus -in private.key | openssl md5 与 openssl req -noout -modulus -in request.csr | openssl md5,两个MD5值必须一致
四、高频翻车点
CN与浏览器访问域名不一致:证书会被浏览器报错
私钥丢失后重新生成CSR:必须用原私钥,否则证书无法使用
特殊字符未转义:公司名含&、,等符号时,命令行中需加引号或用配置文件
CSR本质上是一份"我是谁、我要保护哪些域名"的声明,字段准确、私钥配对、SAN完整,三者满足即无问题。

SSL证书怎么存才安全,别让私钥裸奔
拿到证书那一刻,真正的风险才开始。私钥泄露=证书白搭。

核心原则:私钥和证书必须分开存放
很多人把.crt和.key扔同一个目录,权限755,这等于把钥匙和门牌号贴一起。

正确做法:

文件 存放位置 权限
证书(.crt) 公开目录,Web能读取 644
私钥(.key) 非Web目录,如/etc/ssl/private/ 600
中间证书 跟证书放一起 644
Nginx配置里用绝对路径指向私钥,别跟证书放同级目录。

服务器上的防护

  1. 权限锁死

bash
chmod 600 /etc/ssl/private/yourdomain.key
chown root:root /etc/ssl/private/yourdomain.key
只有root能读,Nginx用单独用户跑,配ssl_certificate_key时用root启动,然后drop权限。

  1. 别把私钥放代码仓库
    Git里加.gitignore,把.key、.pem全挡住。泄露一次,Git历史里永远有。
  2. 加密存储(进阶)
    私钥用密码加密:

bash
openssl rsa -aes256 -in yourdomain.key -out yourdomain.enc.key
Nginx启动时输入密码加载。重启服务器得人工输入,麻烦但安全。或者用云服务商的KMS(阿里云/AWS)托管私钥,根本不落地。

备份怎么搞
备份必须加密,别传裸文件。

bash
tar czf ssl-backup.tar.gz /etc/ssl/
gpg --symmetric --cipher-algo AES256 ssl-backup.tar.gz
备份文件存两个地方:本地加密包 + 离线介质(U盘锁抽屉里)。别只放云盘,云盘被盗号就全完了。

几个容易忽略的点
问题 后果 做法
私钥没设密码 服务器被入侵直接拿走 openssl rsa -aes256加密
日志里打印了私钥内容 调试时意外泄露 审计日志,确保没输出key内容
证书过期没人管 网站直接变不安全 设监控,过期前30天告警
多台服务器各自存私钥 管理混乱,容易漏更新 统一用配置中心或KMS分发
一句话:证书不怕公开,怕的是私钥被偷。权限600、密码加密、备份加密,这三步做到位,基本就稳了。

移动端配置SSL,分场景说
"移动端"这个词太宽了,得先搞清楚你说的是哪种。

场景一:手机App里用HTTPS(最常见)
App调后端接口,要HTTPS。其实跟PC端没区别:

证书放哪:

iOS:把.p12证书丢进项目的Resources,代码里用URLSession自动就认了。
Android:把证书放res/raw,用OkHttp的CertificatePinner固定证书指纹,防中间人。
关键代码(Android):

kotlin
val certificatePinner = CertificatePinner.Builder()

.add("yourdomain.com", "sha256/AAAAAAAAAA...") // 证书指纹
.build()

val client = OkHttpClient.Builder()

.certificatePinner(certificatePinner)
.build()

别偷懒: 必须做证书锁定(pinning),不然抓包工具一插就能看到明文。

场景二:手机浏览器访问你的网站
这个不用你在手机上配置什么。证书装在服务器上,手机浏览器自动验证。你要做的只是:

确保证书链完整(别漏了中间证书)
确保HTTPS强制跳转(Nginx那套直接用)
https://www.ssllabs.com/ssltest/测一下,手机访问没红屏就行。

场景三:给手机装自签名证书(内网/测试用)
公司内网环境,自己签发的证书,手机默认不认。

iOS:

证书导出.cer → 用邮件发给自己 → 手机打开附件 → 设置 → 通用 → 关于本机 → 证书信任设置 → 开启完全信任。
Android:

Android 7+不认用户装的CA了。得把证书放system/etc/security/cacerts/,需要root。或者更简单:用adb推送到设备的信任存储(部分ROM支持)。
几个坑
坑 后果 解决
证书链不完整 安卓报错"证书不可信" Nginx里把中间证书concat到crt后面
没做证书锁定 App被抓包,数据全裸 必须pin证书指纹
自签名证书没加信任 手机直接拦截连接 iOS手动信任,Android要root
TLS版本太低 部分新手机直接拒绝连接 最低TLS 1.2,推荐1.3
一句话:移动端配置SSL,90%的工作在服务器端,不在手机上。手机那头基本就是"装证书→信任"两步的事。

SSL证书申请,安全策略到底有没有门槛?
先说结论:大部分免费证书没有,但部分证书有,主要看你选哪家。

Let's Encrypt / ZeroSSL(免费派)
零门槛。

不看你服务器安全等级,不审你网站内容,不查你有没有WAF。只要你能证明域名是你的(DNS验证或文件验证),就给发。

甚至你网站挂着XSS漏洞,照样能拿到证书。证书只管加密传输,不管你站本身安不安全。

唯一的"要求":

域名能正常解析
80或443端口能被外部访问(验证用)
付费DV证书(阿里云、腾讯云等)
基本也没要求。

DV(Domain Validation)就是验证域名归属,流程和Let's Encrypt差不多,只是多了一步人工/DNS审核。对服务器安全策略没有任何硬性要求。

OV / EV证书(企业型)
这里开始有要求了。

证书类型 审核内容 安全相关要求
DV 验证域名 无
OV 验证企业身份 要求企业有合法主体,部分CA会做基本的域名安全扫描
EV 严格企业审核 要求较高的安全基线,比如不支持弱加密套件,必须TLS 1.2+
OV/EV的"安全要求"主要是:

不能用已知被劫持的域名申请(CA会查黑名单)
必须禁用SSLv3、TLS 1.0/1.1(这是协议层面的要求,不是你服务器的)
私钥长度最低2048位(RSA)或256位(ECC)
真正影响你能不能拿到证书的"安全问题"
不是你服务器多安全,而是:

域名被列入CA黑名单 —— 之前被用于钓鱼/恶意分发,直接拒发,没商量。
CSR里填了非法信息 —— 比如用别人公司名申请,OV/EV会被拒。
端口被墙 —— 80端口不通,HTTP验证方式走不了,只能换DNS验证。
一句话总结
免费证书:你只要有域名就行,安全策略跟它没关系。
付费DV:多验证个企业信息,服务器安全不管。
OV/EV:有基线要求,但审的是你企业,不是你服务器。

所以别因为"觉得自己站不够安全"就不敢申请证书。恰恰相反,越是安全一般的站,越该先把HTTPS加上——至少传输层的数据别裸奔。

全站SSL配置,照着做就行
第一步:拿到证书
两条路:

免费:Let's Encrypt,用certbot一键拉,90天自动续期,够用了。
付费:阿里云/腾讯云买,适合需要通配符证书(*.yourdomain.com)或者要备案的场景。
拿到手就是两个文件:.crt(公钥证书)和 .key(私钥),放服务器上,权限设成600,别让别人读到私钥。

第二步:Nginx 配置(最常见)
nginx
server {

listen 443 ssl;
server_name yourdomain.com;

ssl_certificate     /path/to/yourdomain.crt;
ssl_certificate_key /path/to/yourdomain.key;

# 推荐的安全配置,直接抄
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# 你的站点配置
root /var/www/html;
index index.html;

}

HTTP强制跳HTTPS

server {

listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;

}
改完 nginx -t 检查语法,没报错就 systemctl reload nginx。

第三步:全站强制HTTPS
光Nginx跳转还不够,得在应用层也堵住HTTP的口。

方式一:Nginx加Header

nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
这行的意思是:浏览器记住一年内只用HTTPS访问这个域名,包括子域名。

方式二:代码层重定向

以Node.js为例:

js
app.use((req, res, next) => {
if (req.headers['x-forwarded-proto'] !== 'https') {

return res.redirect(`https://${req.hostname}${req.url}`);

}
next();
});
几个容易踩的坑
问题 原因 解决
混合内容警告 页面里引用了http://的资源 全站搜索替换成https://或//协议相对路径
证书不信任 没用CA签发的证书,自己签的 生产环境别用自签名,浏览器会拦
续期失败 certbot cron没跑或者防火墙挡了80端口 检查certbot renew --dry-run
配置完用
SSL Labs
测一下,拿到A或A+就算过关了。

SSL证书 SSL证书购买 SSL证书申请 SSL证书价格 泛域名证书 通配符证书 通配符SSL证书 https证书 便宜SSL证书 便宜证书 SSL证书多少钱 申请SSL 域名SSL sectigo证书