zoukankan      html  css  js  c++  java
  • OPENSSL使用方法

    OPENSSL使用方法

    前置知识
    KEY 通常指私钥。
    CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。
    CRT 即 certificate的缩写,即证书。
    X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
    X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
    PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN…“开头,”-----END…"结尾,内容是 BASE64 编码。Apache 和 *NIX 服务器偏向于使用这种编码格式。
    DER - Distinguished Encoding Rules,打开看是二进制格式,不可读。Java 和 Windows 服务器偏向于使用这种编码格式。
     
    设置配置文件
    进OPENSSL目录
    cd d:openssl
    set OPENSSL_CONF=openssl.cfg
     
    生成一份 CA 根证书
    1) 创建私钥ca.key
    # 输出 key 密钥文件。
    openssl genrsa -des3 -out ca.key 2048   # 长度为2048
    参数说明:
    genras 使用 rsa 算法生成密钥。
    -des3 (可选)加密密钥,此时需要设置密码,后续使用该密钥时需要验证密码才能使用。
    -out 生成私钥文件。
     
    2) 生成证书请求文件ca.csr
    # 输入 key 文件, 输出 csr 请求文件。
    openssl req -new -key ca.key -out ca.csr
    参数说明:
    req 产生证书签发申请命令。
    -new 新的申请。
    -key 输入的 key 文件,由第一步生成。
    -out 输出为 CSR 文件,这是一个请求文件。
    运行此命令后进入交互模式,需要输入一些证书信息。
    一般需要输入的信息如下:
    C 国家
    ST 省份
    L 市
    O 机构
    OU 部门
    CN (Common Name) 一般是域名
    emailAddress 邮箱
     
    3) 自签署证书ca.crt
    正常的证书是你把上面生成的请求文件(.CSR)发送给可信机构(CA),让可信机构根据你的请求去生成和签署证书,再给你发回来。这里是自己给自己签署。
    # 输入 csr 请求文件,指定签署的 key,输出证书 crt 文件。
    openssl x509 -req -sha256 -days 3650 -in ca.csr -signkey ca.key -out ca.crt
    参数说明:
    x509 签发X.509格式证书命令。
    -req 证书输入请求。
    -days 证书有效天数。
    -in 输入文件,这里是上一步生成的请求文件(.CSR)
    -signkey 签名密钥(key)文件,由第一步生成。
    -out 输出文件,生成证书文件(.CRT)。
    以上 2、3 两步可以合成一步来执行:
    # 输入 key 文件,输出证书 crt 文件。(自签署)
    openssl req -new -x509 -sha256 -days 3650 -key ca.key -out ca.crt
    省去生成请求文件的步骤。
    此时 CA 证书生成完成。
    一般情况下,上面的 key 和 crt 可以直接拿来应用了。
    以下演示把当前的证书当成 CA 给其他的请求进行颁发证书。
     
    颁发服务器证书
    1) 创建服务器私钥server.key
    # 输出 key 密钥文件。
    openssl genrsa -out server.key 2048   # 长度为2048
    参数说明:
    genras 使用 rsa 算法生成密钥。
    -out 生成私钥文件。
     
    2) 生成证书请求文件server.csr
    # 输入 key 文件, 输出 csr 请求文件。
    openssl req -new -key server.key -out server.csr
    参数说明同上一节。

    3) 使用 CA 证书进行签署,生成 crt 文件server.crt
    # 输入服务器给的 csr 请求文件,使用指定 CA 的私钥和证书来签署,输出服务器证书 crt。
    openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
     
    颁发客户证书
    1) 创建客户私钥client.key
    # 输出 key 密钥文件。
    openssl genrsa -out client.key 2048   # 长度为2048
    参数说明:
    genras 使用 rsa 算法生成密钥。
    -out 生成私钥文件。
     
    2) 生成证书请求文件client.csr
    # 输入 key 文件, 输出 csr 请求文件。
    openssl req -new -key client.key -out client.csr
    参数说明同上一节。

    3) 使用 CA 证书进行签署,生成 crt 文件client.crt
    # 输入服务器给的 csr 请求文件,使用指定 CA 的私钥和证书来签署,输出服务器证书 crt。
    openssl x509 -req -sha256 -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
     
    实践总结
    CA 证书和服务器证书的区别只有最后签署时,是自己给自己签署,还是让别人给你签署。
    实际应用时需要的是私钥(key)和证书(crt)文件。其中私钥文件很重要,不要公开出去。证书文件可以随意分发。
    把 crt 证书文件加入可信任的根机构中,则该证书和其签署的所有证书都会被信任。那么在一个机构内部可以自建一个 CA 证书,CA 证书加入可信列表,然后机构内部的所有其他证书都使用该证书来签署,则只需要信任一次就够了。
    nginx 中使用 ssl 的方式是,在配置文件中加入以下语句:
    ssl_certificate     /path/to/your.crt;
    ssl_certificate_key /path/to/your.key;
     
    对于 IIS 的设置
    在 IIS 中,需要的是一个 PFX 文件,这个文件需要包含 key 和 crt。生成方法如下:
    # 输入 key 和 crt 文件,输出 pfx 文件。
    openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
    执行上述命令时,会要求输入一个 export 密码。 该密码在导入 pfx 文件时需要。
    在 IIS 中选择“导入证书”,文件选择该 pfx 文件,密码填写导出时的密码,导入位置选择“个人”。
    如要修改证书的 friendly name ,则在证书管理中修改(需要从 mmc 中打开计算机级别的证书管理器)。
     
    解决 Chrome 报 missing_subjectAltName 的问题
    chrome 会查看当前域名是否在证书中声明,该声明由 subjectAltName 字段设置。上述的生成步骤默认未设置该字段。
    解决方法如下:
    新建一个文件,起名为 v3.ext (名字自定),编辑内容如下:
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = *.company.net
    域名要与你的证书实际绑定的域名一致。如有多个域名,按示例写多个。
    在签署时,额外增加一个参数: -extfile v3.ext
    # 这是上面服务器签署的示例,只在最后增加一个参数,指定扩展字段的配置文件。
    openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile v3.ext
    更多用法
    1) 通过配置文件,非交互式生成证书请求文件(CSR)
    新建一个文件,如 my.cnf ,相应字段按自己需求修改:
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    C  = CN
    ST = GuangDong
    L  = ShenZhen
    O  = your_company
    OU = your_organize
    CN = www.myserver.com
    emailAddress = admin@myserver.com
    在生成请求文件时,额外增加参数: **-config  my.cnf **
    # 指定配置文件,此时不会出现交互模式,相交信息自动设置。
    openssl req -new -key server.key -out server.csr -config my.cnf

    2) 一句话生成 key 和 crt 文件
    该情形适合于自签署证书时。
    请求的配置和 ext 的配置可以写在一起,如下
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    [req_distinguished_name]
    C  = CN
    ST = GuangDong
    L  = ShenZhen
    O  = your_company
    OU = your_organize
    CN = www.myserver.com
    emailAddress = admin@myserver.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = myserver.com
    DNS.2 = *.myserver.com
    然后运行如下命令:
    # 一句命令,输入配置文件 my.conf, 输出 key 和 crt 文件。适合于自签署证书。
    openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:1024 -keyout app.key -out app.crt  -config my.conf
     
  • 相关阅读:
    电子邮件为什么要编码以及产生乱码的原因?
    UTF8国际通用为什么还要用GBK?
    python 调用shell命令的方法
    script —— 终端里的记录器
    IP数据报是如何在网络中转发的?
    网际协议:无连接数据报交付(IPv4)
    fork与vfork
    strlen与sizeof有什么区别?
    网络地址到物理地址的映射(ARP)
    分类的因特网地址
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/11301262.html
Copyright © 2011-2022 走看看