欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用OpenSSL生成多域名自签名证书

程序员文章站 2022-07-12 22:08:04
...

使用OpenSSL生成多域名自签名证书

证书生成过程介绍

证书的目的是建立特定**对与特定实体之间的联系。

自签名根证书是指一堆**对的私钥对自己相应的公钥生成的证书请求进行签名而颁发的证书,证书的申请人和签发人都是同一个。

  • 需要一对**对;

    常用的是RSA,DSA**,ECDSA**,用于**交换的证书不能用DSA,只能用RSA,因为DSA不能加解密也不能做**交换,只能做签名;ECDSA还没有被大部分的CA支持;

  • 证书认证请求文件(csr文件)

    这是按照一定格式生成的文件,里面包含实体信息
    将实体信息和公钥一起用相应的私钥签名,是CA(证书认证)能确认这些信息是用户发送的(证书请求中的公钥拿出来验证这个证书请求的签名)
    通过OpenSSL的req指令填写和生成这个csr文件
    不同的CA要求,可能需要更改默认的配置文件openssl.cnf

  • 将证书请求文件(csr文件)给CA签发

    验证证书请求上的签名是否正确,确保公钥对应的私钥就在申请者手中并且申请信息是正确没被更改的
    CA对某些字段信息可能有特殊的要求,比如要求国家,身份等信息要求跟CA本身设定的一样
    如果CA是在OpenSSL指令的基础上,那么它使用的签发指令可能是ca,也可能是x509

常用指令

req 指令

req指令既可以直接生成一个新的自签名证书,也可以根据现有的证书请求和其相应私钥生成自签名根证书。如果是根据现有证书请求生成自签名根证书,那么一定要-key选项指定相应的私钥指令才能执行成功。

req 指令也可以生成**对,但在使用req 同时生成**对是对**对保存和格式有限制(只能是PEM编码,DES3-CBC模式加密)。如果需要更灵活的处理,可以使用genrsa或者gendsa先生成**然后使用-key选项指定。

参数选项

  • -new 指定执行生成新的证书请求,此时会忽略 -in 指定的内容
  • -x509 根据现有的证书请求生成自签名根证书(要求使用 -key 指定证书请求里面的公钥相应的私钥,以便对自签名根证书进行签名)
  • -key 指定输入的**,如果不指定此选项会根据 -newkey 选项的参数生成**对
  • -newkey 指定生成一个新的**对,只有在没有 -key 选项的时候才生效,参数形式为rsa:numbits 或者 dsa:file
  • -subj直接从指令行指定证书请求的主体名称,格式为/分割的键值对字符串,如果没有此选项,那么会弹出交互提示;
  • -days 设定了生成的自签名根证书的有效期,单位为天;该选项只有在使用了 -x509 选项生成自签名证书的时候才生效,默认为30天。
  • -config 指定req指令在生成证书请求的时候使用的OpenSSL配置文件,一般默认为 openssl.cnf
  • -extensions 选项指定了生成自签名根证书的时候使用的扩展字段,其参数为OpenSSL配置文件中的某个字段名
  • -reqexts 选项指定了生成证书请求是使用的扩展字段,该字段参数也是配置文件中的某个字段名
  • -text 让指令输出证书请求或者自签名根证书内容的明文解析,默认情况下,它将输出所有可能输出的内容,如果使用了reqopt选项,则输出内容取决于reqopt选项
  • -reqopt 指定text 选项输出的内容,可以为多个,每个之间使用,分隔
  • -set_serial指定生成的自签名根证书的***,默认情况下生成的自签名根证书***是0;该选项也只有在生成自签名根证书的时候有效。
  • -keyout 置顶新生成的私钥的输出(仅在使用了 -newKey-new 选项导致生成新**对的时候才有效,如果使用了 -key 则此选项被忽略)
  • -keyform 指定输入**的编码格式(比如PEM,DER,PKCS#12,Netscape,IIS SGC,Engine等)
  • -in 指定输入证书请求文件,如果使用了 -new 或者 -newkey 选项,此选项被忽略
  • -inform 指定输入证书请求文件的编码格式(比如PEM,DER)
  • -out 指定输出证书请求文件或自签名证书文件
  • -noout 使用此选项后,指令将不会输出编码的证书请求或者自签名根证书到 -out 选项指定的文件中,一般用来测试指令或者查看证书请求的信息
  • -outform 指定输出证书请求文件或自签名证书的编码格式(比如PEM,DER)
  • -pubkey 使用此选项活 指令将输出PEM编码的公钥到 -out 选择指定的文件中,默认情况下只输出私钥到 -keyout 指定的文件,并不输出公钥。
  • -passin 指定读取 -key 选项指定的私钥所需要的解密口令,如果没有指定,私钥又有**的话,会弹出交互提示
  • -passout 指定 -keyout 选项输出私钥时使用的加密口令
  • -nodes 表示不对私钥进行加密,如果指定此选项,则忽略 -passout 指定的口令;如果没有此选项,却指定了 -passout 则会有交互提示。
  • -digest 指定生成证书请求或者自签名根证书是使用的信息摘要算法,一般在生成数字签名的时候使用。
  • -verify 使用此选项对证书请求中的数字签名进行验证操作,并给出失败或者成功的提示信息,其验证的过程是从证书请求里面提取公钥,然后使用该公钥对证书请求的数字签名进行验证。
  • 如果没有 -key 选项也没有 -newkey 选项,则会根据 openssl.cnfreq 字段的 default_bits 选项的参数,生成一个RSA**
  • 如果没有使用 -nodes 选项,并且生成了新的私钥,私钥会被输出到 -keyout 指定的文件中时将被以DES3的CBC模式加密。

使用实例

  • 生成一个新的证书请求,使用新的rsa2048位**,输出证书请求到request.pem,**到 private.pem, 私钥口令为 12345678

    openssl req -new -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out request.pem
    
  • 对证书请求签名进行验证

    openssl req -in request.pe -verify -noout
    
  • 生成一个自签名的根证书

    openssl req -x509 -newkey rsa:2048 -keyout private.pem -passout pass:12345678 -out selfsign.crt
    
  • 显示证书请求内容

    openssl req -text -in fd.csr -noout
    

ca 指令

ca指令模拟一个完整的CA服务器,它包括签发用户证书,吊销证书,产生CRL及更新证书库等管理操作

参数选项

  • -config 指定要使用的配置文件,如果没有此选项,则会先查找OPENSSL_CONF 或者 SSLEAY_CONF 定义的文件名,如果这两个环境变量都没有定义,就使用OpenSSL安装的默认路径,一般是 /usr/local/openssl/openssl.cnf,具体看安装配置
  • -startdate 设置证书的生效时间 格式为 YYMMDDHHMMSSZ 指定年月日时分秒,如果没有则使用主配置文件中的 default_startdate
  • -enddate 格式跟 -startdate 一样
  • -days 设置证书的有效天数,生效时间到到期时间之间的天数,如果使用了 -enddate,此选项被忽略
  • -name 指定配置文件中CA选项的名称
  • -notext 不输出明文信息到证书文件
  • -subj直接从指令行指定证书请求的主体名称,格式为/分割的键值对字符串,如果没有此选项,那么会弹出交互提示;
  • -cert 参数是一个可以包含路径的文件名,该文件是一个PEM编码的X.509证书文件
  • -keyfile 参数是一个包含路径的文件名,文件格式可以为PEM,DER,PKCS#12,Netscape,IIS SGC,Engine,但需要通过 -keyform 指定到底是哪种格式
  • -policy 指定CA的匹配策略
  • -extensions 指定x509 v3扩展字段的字段名,如果没有这个选项就由 -extfile 中内容
  • -extfile 指定x509 v3扩展的配置文件,如果没有 -extensions 字段,则由CA主配置文件中的 x509_extensions 选项指定
  • -in 指定一个可以包含路径的证书请求文件名,应该是PEM变得PKCS#10格式的证书请求
  • -infiles指定一系列包含PEM编码证书请求的文件,包含多个,只能作为指令的最后一个选项,其后的参数都被认为是证书请求文件
  • -out 选项指定了输出签发好的证书或者新生成的CRL的文件,如果没有使用 -notext 选项,那么证书的明文信息也会输出到 -out 选项指定的文件中
  • -outdir选项指定了新生成的证书的输出目录,默认输出到newecerts目录,并使用.pem作为后缀,都是PEM编码。

x509指令

x509指令能以各种方式显示一个证书的内容,也可以对一个证书的格式进行转换,还可以签发证书

参数选项

  • -in
  • -inform
  • -out
  • -outform
  • -keyform
  • -CA 指定签发证书或者转换证书格式的时候需要的CA证书文件
  • -CAkey 指定签发证书或者转换证书格式时需要的CA证书对应的私钥文件路径
  • -CAform 指定CA证书文件的格式
  • -CAkeyform 私钥文件格式
  • -startdate
  • -enddate
  • -pubkey
  • -noout

使用实例

  • 使用现有证书生成证书请求文件

    openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key
    
  • 使用证书请求文件生成自签名证书

    openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
    
  • 显示证书内容

    openssl x509 -text -in fd.crt -noout
    

crl指令

crl指令用于显示、处理和验证CRL文件信息

参数选项

  • -in
  • -inform
  • -out
  • -outform
  • -noout

开发测试使用自签名证书实例

生成认证私钥 私钥 私钥

# 要输入密码
openssl genrsa -des3 -out domain-dev-enc.key 2048
# 可以通过如下方式解密(输入上面的密码)
openssl rsa -in domain-dev-enc.key -out domain-dev.key

生成带有SAN(Subject Alt Name)的自签名证书

生成对多个主机有效的自签名证书

missing_subjectAltName 问题解决

原有的简单自签名证书在chrome里面,会提示 missing_subjectAltName

需要全局找一份openssl.cnf ,或者下载一份openssl 那里有

openssl req -new -sha256  \
    -x509 \
    -days 10000 \
    -key domain-dev.key \
    -subj "/C=CN/ST=BeiJing/L=Beijing/O=QUNAR/OU=FE/CN=domain.com" \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=DNS.1:domain.com,DNS.2:q.domain.com,DNS.3:*.domain.com")) \
    -out domain-dev.crt

相关字段的信息

C  => 国家 Country 
ST => 省 State
L  => 市 City
O  => 机构 Organization
OU => 部门 Organization Unit
CN => 域名 Common Name (证书所请求的域名)
emailAddress => main administrative point of contact for the certificate
相关标签: 技术教程