申请SSL证书的时候,CA机构会要求提交CSR文件。不少人第一次碰到这个文件不清楚它的作用,也不知道怎么生成。CSR本质是一份申请表单,写入域名、企业信息,附带公钥,并且用私钥完成签名,证明这份申请由你本人提交。CA核验你对域名的控制权之后,签发证书。整个流程私钥始终保存在本地,CSR和私钥成对生成,但CSR文件内部不会包含私钥。
OpenSSL是生成CSR最常用工具,Linux、macOS系统自带,Windows安装Git Bash或者WSL也可以使用。打开终端,执行一行命令,举例申请www.example.com证书,命令如下:

openssl req -new -newkey rsa:2048 -nodes -keyout example.key -out example.csr
回车之后会弹出交互提问,国家代码填写CN,省份填写拼音或者英文,城市、公司、部门名称如实填写,Common Name是核心项,填写申请证书的域名;通配符证书就填写*.example.com。填写完成,当前目录生成两个文件,example.key是私钥,example.csr就是提交给CA的申请文件。
不想交互式填写信息,可以通过-subj参数一次性传入全部主题信息,格式示例:/C=CN/ST=Guangdong/L=Shenzhen/O=Your Company/OU=IT/CN=example.com,直接执行生成,无需手动应答。密钥长度推荐2048位,4096位安全等级更高,但握手阶段耗时略长,普通网站2048足够。ECC密钥现在应用越来越多,生成速度更快,同等安全强度密钥长度更短,前提是确认CA机构支持。
生成文件之后,校验CSR内容。openssl req -noout -text -in example.csr,这条命令输出CSR内部全部信息,公钥、主题字段、签名算法都会展示。重点核对Common Name是否为目标域名,Subject Alternative Name确认附加域名没有遗漏。部分CA支持提交CSR后单独填写SAN,多域名证书建议生成CSR阶段就配置好SAN,减少后续修改。配置SAN需要OpenSSL配置文件,[req]段添加req_extensions,[req_ext]段写入subjectAltName = @alt_names,下方依次列出DNS.1、DNS.2。配置步骤略繁琐,但一次性配置完成后续复用更省事。
不想使用命令行,很多主机面板提供一键生成CSR。宝塔面板进入网站SSL选项,选择其他证书,找到CSR生成入口,填写域名、企业信息,页面直接展示CSR和私钥。cPanel在SSL/TLS模块,选择生成、查看或删除SSL证书签名请求,填写表单即可。阿里云、腾讯云证书服务也支持在线生成CSR,使用前确认私钥生成位置,区分是本地生成,还是平台托管私钥。平台托管私钥操作简单,但私钥经过第三方存储,存在额外风险。
Windows服务器使用IIS的场景,打开IIS管理器,选中服务器证书,右侧操作栏选择创建证书申请,跟随向导填写信息,导出txt文件,这个文件就是CSR。填写公用名称必须是域名,加密服务提供程序选择Microsoft RSA SChannel Cryptographic Provider,位长2048。复制txt内容提交CA,IIS会保留挂起的证书申请,证书签发完成,执行完成证书申请,把证书和私钥绑定。
有几个坑需要提前留意。CSR和私钥成对生成,私钥丢失,CSR直接失效,就算证书签发也无法使用。私钥文件做好备份,严格限制权限,不要放置在网站根目录。提交资料只发送CSR,绝对不要上传.key私钥文件,CA不需要私钥,任何索要私钥的请求都是异常行为。网页在线CSR工具操作便捷,但私钥在第三方服务器生成,服务商可以获取私钥。正规CA不会出现这类问题,小众第三方工具风险更高,优先本地生成。
CSR属于PEM格式文本,记事本就能打开,开头-----BEGIN CERTIFICATE REQUEST-----,结尾-----END CERTIFICATE REQUEST-----,中间Base64编码存储申请信息。提交CA时,直接复制全部文本粘贴网页表单,或者上传.csr文件,两种方式均可。CA签发完成,拿到.crt或者.pem证书文件,搭配之前生成的.key私钥配置服务器,HTTPS加密服务就可以启用。