通过OpenSSL自签CA为Android服务器签发证书

使用OpenSSL创建CA及签发服务器证书
本文介绍如何使用OpenSSL创建CA根证书并为服务器签发证书。包括安装配置OpenSSL、生成根证书及其私钥、签发服务器证书等步骤。适用于Android平台上的Https通信。

文章目录


##前言
不知道大家有没有留意过开源库 AndServerNanoHttpd。这两个开源库都能实现在Android平台上快速搭建服务器,功能非常强大,也都分别支持 Https安全通信,大家如果有兴趣可以点进去看看。本文也是因为使用到Https通信,需要用到自签的服务器端证书,需要自己创建CA,并由这个CA去给服务器端签发证书( 因为我只需要客户端去认证服务器端的合法性,所以只用签发服务器端证书)。那么接下来就直接具体介绍一下怎么使用OpenSSL来创建CA,并为服务器端签发证书。
##配置环境

  • 安装OpenSSL
    这里不介绍如何安装openssl了,大家可以自行搜索下安装方法,其中在Linux上安装和在Windows下的安装方法全然不同,OpenSSL官方不提供window上的安装包,但有第三方提供了,这里提供一下链接win openssl 。在完成OpenSSL的安装之后,可以先修改下配置文件。

  • 修改配置文件

    • 修改dir
      这里写图片描述
    • 创建必要文件和文件夹
      这里写图片描述
    certs -- 用于存放已颁发的证书
    newcerts -- 存放CA指令生成的新证书
    private -- 用于存放私钥
    crl -- 用于存放已吊销的证书
    csr -- 用于存放证书申请文件
    index.txt -- Openssl 定义的已签发证书的文本数据文件,通常在初始化的时候是空的
    serial -- 证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行保存的,该文件必须提供并且包含一个有效的序列号
    
      生成证书之前,需要先生成一个随机数:
    
    openssl rand -out private/.rand 1000
    

##创建CA根证书

  • 生成根证书私钥(key文件)
    命令:openssl genrsa -aes256 -out private/ca.key 1024
    这里写图片描述
    命令说明:

    genrsa --- 使用RSA算法生成私钥
    -aes256 ---使用256位密钥的AES算法对私钥进行加密
    -out ---输出文件的路径
    1024 -- 指定私钥长度
    
  • 生成根证书请求文件(csr文件)
    命令:

    openssl req -new -key private/ca.key -out csr/ca.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"
    

    这里写图片描述
    命令说明:

    req --- 执行证书签发命令
    -new --- 新证书签发请求
    -key ---指定私钥路径
    -out --- 输出的csr文件的路径
    -subj --- 书相关的用户信息(subject的缩写)
    
  • 自签发根证书(crt文件)
    命令:

    openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key -in csr/ca.csr -out certs/ca.crt
    
    

    这里写图片描述
    命令说明:

    x509 --- 生成x509格式证书
    -req --- 输入csr文件
    -days --- 证书的有效期(天)
    -sha1 -- 证书摘要采用sha1算法
    -extensions --- 按照openssl.cnf文件中配置的v3_ca项添加扩展
    -signkey --- 签发证书的私钥
    -in --- 要输入的csr文件
    -out --- 输出的cer证书文件
    

这样,就可以生成一个根证书了,可以在certs文件夹中找到。
##用CA根证书签发服务器证书

  • 生成服务器私钥

    openssl genrsa -aes256 -out private/server.key 1024
    

    这里写图片描述

  • 生成服务器证书请求文件

    openssl req -new -key private/server.key -out csr/server.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"
    

    这里写图片描述

  • 由CA根证书签发服务器证书

    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.crt -CAkey private/ca.key -CAserial ca.srl -CAcreateserial -in csr/server.csr -out certs/server.crt
    

    这里写图片描述

    命令说明:

    -CA – 指定CA证书的路径
    -CAkey – 指定CA证书的私钥路径
    -CAserial – 指定证书序列号文件
    -CAcreateserial – 表示创建证书序列号文件(上面提到的serial文件),创建序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀
    -extensions – 拓展参数,这里指定为v3_req,打开之前的配置文件可以看到这个属性。
    这里写图片描述

    在上面CA自签根证书的时候,用到的是v3_ca, basicConstraints属性值为CA:TRUE,表明该证书是颁发给CA的证书:
    这里写图片描述

导出服务器证书

通过以上步骤,就可以得到由CA签发的服务器端的证书了,那么,我们得到这个证书之后怎么使用?我们都知道Java使用的是jks格式的秘钥库,而Android使用的bks格式的秘钥库。
那此时,我们的目标是得到一个bks格式的秘钥库:

  • 将签发证书和服务器秘钥合并导出为pcks格式

    openssl pkcs12 -export -in certs/server.crt -inkey private/server.key -out server.p12
    

这里写图片描述

  • 格式转换

    • 转换为pkcs8,以明文的方式保存
    openssl pkcs8 -in private/server.key -topk8  -nocrypt -out sever8.key  
    
    
    • 转换为jks或者bks

      使用到一个工具 : Portecle
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述

<think>好的,用户想了解如何创建和使用自名SSL证书。之前他们问过关于在Windows上配置Apache的SSL证书,现在转向生成和使用自证书。首先,我需要结合用户提供的三个引用来整理步骤,但要注意用户的需求可能与引用中的内容不完全一致,比如用户可能是在Windows环境下操作,而引用1和2主要针对Linux和Nginx,引用3提到了宝塔和Windows。 首先,用户需要生成证书的基本步骤,这可能包括生成私钥、创建CSR、自证书。引用1提到了使用openssl req命令生成证书,其中包含了-x509参数,而引用2则详细介绍了生成key、csr、crt的过程,还提到了去除密码的步骤。用户可能需要跨平台的信息,比如在Linux和Windows下如何操作。 然后,用户可能需要配置服务器使用这些证书,比如Apache或Nginx。之前的对话中用户配置的是Apache,但这次的问题更通用。需要区分不同服务器的配置方法,比如Apache的SSLCertificateFile和Nginx的ssl_certificate。 另外,用户可能关心如何避免浏览器警告,因为自证书不被信任,引用2提到了这一点,但可能需要更详细的说明,比如如何将证书导入到受信任的根证书颁发机构。 还需要考虑常见问题,比如证书有效期、密钥长度、密码保护等。引用1提到使用-nodes参数避免密码保护,引用2提到生成后移除密码的步骤。用户可能需要知道这些细节,以确保服务器能够自动加载证书而无需手动输入密码。 此外,引用3提到了宝塔面板和Windows安装证书的方法,但用户的问题更关注自证书生成和使用,可能需要简要提及这些工具,但重点放在命令行操作上。 最后,用户可能需要验证证书是否正确安装,比如使用浏览器检查或命令行工具如curl。此外,安全方面的注意事项,比如自证书的局限性,仅适用于测试环境等,也需要提及。 现在需要将这些信息整合成清晰的步骤,涵盖生成证书、配置服务器、安装到系统信任库、验证等。同时要确保命令的正确性,路径的正确处理,以及不同操作系统的差异,比如Windows中使用OpenSSL可能需要额外安装,而Linux通常自带。 需要注意用户可能混淆了不同服务器的配置步骤,比如将Nginx的配置应用到Apache上,所以需要明确区分。同时,用户可能对证书链的概念不太清楚,需要解释自证书不需要中间证书,因此配置时可能只需指定证书文件和私钥。 还要考虑到用户可能遇到的常见问题,如权限问题、路径错误、端口配置等,提供相应的解决建议。例如,引用中提到端口443被占用,这在配置服务器时需要注意。 总之,回答需要结构清晰,分步骤说明生成和使用自证书的过程,涵盖不同平台和服务器类型,指出注意事项和常见问题,并最后给出相关问题供用户进一步学习。</think>### 分步指南:创建和使用自名SSL证书 #### 1. **生成证书** 自证书无需通过证书颁发机构(CA)验证,适用于测试或内部环境。 ##### **步骤1:生成私钥** 使用OpenSSL生成RSA私钥文件(默认长度2048位): ```bash openssl genrsa -out server.key 2048 ``` - **参数说明**: - `genrsa`:生成RSA私钥 - `-out`:指定输出文件名 - `2048`:密钥长度(推荐至少2048位) ##### **步骤2:创建证书名请求(CSR)** 生成CSR文件(需填写证书信息): ```bash openssl req -new -key server.key -out server.csr ``` - **填写示例**: ``` Country Name (2 letter code) []:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) []:Beijing Organization Name (eg, company) []:Test Corp Common Name (eg, your name or server's hostname) []:localhost # 必须与域名或IP匹配 ``` ##### **步骤3:生成证书** 使用私钥直接签发证书(有效期365天): ```bash openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt ``` - **关键参数**: - `-x509`:生成证书(而非CSR) - `-days 365`:证书有效期 - `-signkey`:使用私钥直接名[^1][^2] --- #### 2. **配置服务器使用证书** 根据服务器类型选择配置方式: ##### **Nginx配置示例** ```nginx server { listen 443 ssl; server_name localhost; ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧协议提升安全性 } ``` ##### **Apache配置示例** ```apache <VirtualHost *:443> SSLEngine on SSLCertificateFile /path/to/server.crt SSLCertificateKeyFile /path/to/server.key SSLProtocol All -SSLv2 -SSLv3 # 禁用不安全协议 </VirtualHost> ``` ##### **Windows IIS配置** 1. 将 `.crt` 和 `.key` 转换为 `.pfx` 格式: ```bash openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt ``` 2. 在IIS管理器中导入 `.pfx` 文件并绑定到网站[^3]。 --- #### 3. **解决浏览器安全警告** 自证书会被浏览器标记为“不安全”,需手动添加到信任列表: 1. **导出证书**:将 `server.crt` 文件导出为 `.cer` 格式。 2. **导入到系统**(以Windows为例): - 双击 `.cer` 文件 > 选择“安装证书” > 存储位置选“受信任的根证书颁发机构”。 3. **重启浏览器**:访问 `https://localhost` 将显示“安全”锁形图标。 --- #### 4. **高级配置与优化** - **去除私钥密码**(避免服务重启需输入密码): ```bash openssl rsa -in server.key -out server_unencrypted.key ``` - **合并证书链**(如需中间证书): ```bash cat server.crt intermediate.crt > fullchain.crt # 将中间证书追加到主证书 ``` - **自动化续期**(通过脚本定期更新证书): ```bash # 示例脚本(需替换实际路径) openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt systemctl restart nginx # 重启服务生效 ``` --- ### 常见问题解决 - **错误:`SSL_ERROR_BAD_CERT_DOMAIN`** **原因**:证书的Common Name(CN)与访问的域名不匹配。 **解决**:重新生成证书,确保CN字段为实际域名或IP。 - **错误:`ERR_SSL_VERSION_OR_CIPHER_MISMATCH`** **原因**:服务器SSL协议或加密套件配置过时。 **解决**:在配置中禁用SSLv3,启用TLSv1.2+: ```nginx ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers EECDH+AESGCM:EDH+AESGCM; ``` - **性能优化** **启用OCSP Stapling**(减少证书验证延迟): ```nginx ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 valid=300s; ``` --- ### 相关问题 1. 如何为多域名(SAN)生成证书? 2. 自证书CA证书在加密强度上有何区别? 3. 如何通过Let’s Encrypt获取免费可信证书? 4. 自证书在移动端(Android/iOS)如何信任? --- [^1]: OpenSSL官方文档 [^2]: Nginx SSL配置指南 [^3]: Windows Server IIS管理手册
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值