首页 文章

如何使用openssl创建自签名证书?

提问于
浏览
934

我正在为嵌入式Linux设备添加https支持 . 我试图使用以下步骤生成自签名证书:

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem

这有效,但我得到一些错误,例如,谷歌chrome:

这可能不是您要找的网站!该网站的安全证书不受信任!

我错过了什么吗?这是构建自签名证书的正确方法吗?

13 回答

  • 2

    您可以在一个命令中执行此操作:

    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
    

    如果您不想使用密码短语保护私钥,也可以添加 -nodesno DES 的缩写),否则会提示您输入"at least a 4 character"密码 . days参数(365)可以替换为任何数字以影响到期日期 . 然后它会提示您输入"Country Name"之类的内容,但您可以按Enter键并接受默认值 .

    添加 -subj '/CN=localhost' 以禁止有关证书内容的问题(将 localhost 替换为您所需的域)

    除非您先前将自签名证书导入浏览器,否则不会向任何第三方验证自签名证书 . 如果您需要更高的安全性,则应使用CA签署的证书 .

  • 411

    您的一般程序是正确的 . 该命令的语法如下 .

    openssl req -new -key {private key file} -out {output file}
    

    但是,会显示警告,因为浏览器无法通过使用已知证书颁发机构(CA)验证证书来验证身份 .

    由于这是一个自签名证书,因此没有CA,您可以放心地忽略该警告并继续 . 如果您想获得公共互联网上任何人都能识别的真实证书,那么程序如下 .

    • 生成私钥

    • 使用该私钥创建CSR文件

    • 向CA提交CSR(Verisign或其他等)

    • 在Web服务器上安装从CA获得的证书

    • 根据类型证书将其他证书添加到身份验证链

    我在https://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3-common-web-servers/的帖子中有关于此的更多详细信息

  • 370

    我无法评论,所以将此作为单独的答案 . 我发现了一些被接受的单行答案的问题:

    • 单行包含密钥中的密码 .

    • 单行使用SHA1,在许多浏览器中都会在控制台中抛出警告 .

    这是一个简化版本,用于删除密码,提升安全性以禁止显示警告,并在注释中包含一个建议,以传入-subj以删除完整的问题列表:

    openssl genrsa -out server.key 2048
    openssl rsa -in server.key -out server.key
    openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
    openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    

    将“localhost”替换为您需要的任何域 . 您将需要逐个运行前两个命令,因为openssl将提示输入密码 .

    要将两者合并为.pem文件:

    cat server.crt server.key > cert.pem
    
  • 6

    这是我在本地框上使用的脚本,用于在自签名证书中设置SAN(subjectAltName) .

    此脚本使用域名(example.com)并在同一证书中为* .example.com和example.com生成SAN . 以下部分进行了评论 . 为脚本命名(例如 generate-ssl.sh )并为其指定可执行权限 . 这些文件将写入与脚本相同的目录 .

    Chrome 58以后需要在自签名证书中设置SAN .

    #!/usr/bin/env bash
    
    # Set the TLD domain we want to use
    BASE_DOMAIN="example.com"
    
    # Days for the cert to live
    DAYS=1095
    
    # A blank passphrase
    PASSPHRASE=""
    
    # Generated configuration file
    CONFIG_FILE="config.txt"
    
    cat > $CONFIG_FILE <<-EOF
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    x509_extensions = v3_req
    distinguished_name = dn
    
    [dn]
    C = CA
    ST = BC
    L = Vancouver
    O = Example Corp
    OU = Testing Domain
    emailAddress = webmaster@$BASE_DOMAIN
    CN = $BASE_DOMAIN
    
    [v3_req]
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = *.$BASE_DOMAIN
    DNS.2 = $BASE_DOMAIN
    EOF
    
    # The file name can be anything
    FILE_NAME="$BASE_DOMAIN"
    
    # Remove previous keys
    echo "Removing existing certs like $FILE_NAME.*"
    chmod 770 $FILE_NAME.*
    rm $FILE_NAME.*
    
    echo "Generating certs for $BASE_DOMAIN"
    
    # Generate our Private Key, CSR and Certificate
    # Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017
    
    openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"
    
    # OPTIONAL - write an info to see the details of the generated crt
    openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"
    
    # Protect the key
    chmod 400 "$FILE_NAME.key"
    

    此脚本还会写入一个info文件,以便您可以检查新证书并验证SAN是否已正确设置 .

    ...
                    28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                    da:3d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:*.example.com, DNS:example.com
    Signature Algorithm: sha256WithRSAEncryption
         3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
         ...
    

    如果您使用的是Apache,那么您可以在配置文件中引用上述证书,如下所示:

    <VirtualHost _default_:443>
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /var/www/htdocs
    
        SSLEngine on
        SSLCertificateFile path/to/your/example.com.crt
        SSLCertificateKeyFile path/to/your/example.com.key
    </VirtualHost>
    

    请记住重新启动Apache(或Nginx或IIS)服务器以使新证书生效 .

  • 3

    一个班轮FTW . 我喜欢保持简单 . 为什么不使用一个包含所有需要参数的命令?这就是我喜欢它 - 这创建了一个x509证书,它是PEM密钥:

    openssl req -x509 \
     -nodes -days 365 -newkey rsa:4096 \
     -keyout self.key.pem \
     -out self-x509.crt \
     -subj "/C=US/ST=WA/L=Seattle/CN=example.com/emailAddress=someEmail@gmail.com"
    

    该单个命令包含您通常为证书详细信息提供的所有答案 . 通过这种方式,您可以设置参数并运行命令,获取输出 - 然后去喝咖啡 .

    >> more here <<

  • 134

    以下是@diegows's answer中描述的选项,更详细地描述了the documentation

    openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
    

    req
    PKCS#10证书请求和证书生成实用程序 . -x509
    此选项输出自签名证书而不是证书请求 . 这通常用于生成测试证书或自签名根CA. -newkey arg
    此选项可创建新证书请求和新私钥 . 该论证采用了几种形式之一 . rsa:nbits,其中nbits是位数,生成大小为nbit的RSA密钥 . -keyout文件名
    这给出了将新创建的私钥写入的文件名 . - 文件名
    这默认指定要写入的输出文件名或标准输出 . - 天
    当使用-x509选项时,它指定证书证书的天数 . 默认值为30天 . -nodes
    如果指定了此选项,则如果创建了私钥,则不会对其进行加密 .

    文档实际上比上面更详细,我在这里总结一下 .

  • 14

    自2018年起,以下命令可满足您的所有需求,包括SAN:

    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -extensions san -config <(echo '[req]'; echo 'distinguished_name=req'; echo '[san]'; echo 'subjectAltName=DNS:example.com,DNS:example.net') -subj '/CN=example.com'
    

    在OpenSSL≥1.1.1中,这个可以缩短为:

    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -subj '/CN=example.com' -addext 'subjectAltName=DNS:example.com,DNS:example.net'
    

    它创建了一个证书

    • 对域 example.comexample.net (SAN)有效,

    • 相对较强(截至2018年)和

    • 有效期为 3650 天(〜10年) .

    它会创建以下文件:

    • 私钥: example.key

    • 证书: example.crt

    所有信息均在命令行中提供 . 没有讨厌的交互式输入 . 配置文件没有搞乱 . 所有必要的步骤都由这个单一的OpenSSL调用执行:从私钥生成到自签名证书 .

    由于证书是自签名的并且需要手动接受用户,因此使用短期过期或弱加密是没有意义的 .

    将来,您可能希望使用超过 4096 位的RSA密钥和强于 sha256 的哈希算法,但是从2018年开始,这些是理智的值 . 它们足够强大,同时得到所有现代浏览器的支持 .

    备注:从理论上讲,您可以省略 -nodes 参数(这意味着"no DES encryption"),在这种情况下 example.key 将使用密码加密 . 但是,这几乎从不对服务器安装有用,因为您也必须将密码存储在服务器上,或者您必须在每次重新启动时手动输入密码 .

    另见:https://security.stackexchange.com/a/198409/133603https://unix.stackexchange.com/a/333325/20407

  • 64

    我建议添加 -sha256 参数,以使用SHA-2哈希算法,因为主流浏览器正在考虑将"SHA-1 certificates"显示为不安全 .

    接受的答案中的命令行相同 - @diegows添加了-sha256

    openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX

    更多信息在Google Security blog .

    Update May 2018. 许多人在评论中指出,使用SHA-2不会为自签名证书添加任何安全性 . 但我仍然建议使用它作为不使用过时/不安全的加密哈希函数的好习惯 . 完整说明见:https://security.stackexchange.com/questions/91913/why-is-it-fine-for-certificates-above-the-end-entity-certificate-to-be-sha1-base

  • 1615

    生成密钥我使用/ etc / mysql进行证书存储,因为/etc/apparmor.d/usr.sbin.mysqld包含/etc/mysql/*.pem r . sudo su -
    cd / etc / mysql
    openssl genrsa -out ca-key.pem 2048;
    openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
    openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
    openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
    openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
    openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;
    添加配置/etc/mysql/my.cnf [client]
    SSL的CA =的/ etc / MySQL的/ CA-cert.pem
    SSL证书=的/ etc / MySQL的/客户机 - cert.pem
    SSL的密钥=的/ etc / MySQL的/客户机 - key.pem

    的[mysqld]
    SSL的CA =的/ etc / MySQL的/ CA-cert.pem
    SSL证书=的/ etc / MySQL的/服务器cert.pem
    SSL的密钥=的/ etc / MySQL的/服务器key.pem

    在我的设置上,ubuntu服务器登录到: /var/log/mysql/error.log

    跟进说明:

    • SSL error: Unable to get certificate from '...'

    Mysql might be denied read access to your cert file if it is not in apparmors config . 如前面步骤中所述^,将我们所有的证书保存为 /etc/mysql/ 目录中的 .pem 文件,默认情况下由apparmor批准(或修改您的apparmor / SELinux以允许访问存储它们的任何位置 . )

    • SSL error: Unable to get private key

    Your mysql server version may not support the default rsa:2048 format.

    隐蔽生成 rsa:2048 到普通 rsa

    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    

    mysql -u root -p
    mysql>显示类似“%ssl%”的变量;


    | Variable_name | Value |


    | have_openssl |是的|
    | have_ssl |是的|
    | ssl_ca | /etc/mysql/ca-cert.pem |
    | ssl_capath | |
    | ssl_cert | /etc/mysql/server-cert.pem |
    | ssl_cipher | |
    | ssl_key | /etc/mysql/server-key.pem |


    验证连接登录MySQL实例后,您可以发出查询:显示状态,如'Ssl_cipher';
    如果你的连接没有加密,结果将是空白的:mysql> show status like'Ssll_cipher';


    | Variable_name | Value |


    | Ssl_cipher | |


    1排(0.00秒)
    否则,它将为正在使用的密码显示一个非零长度字符串:mysql> show status like'Ssll_cipher';


    | Variable_name | Value |


    | Ssl_cipher | DHE-RSA-AES256-SHA |


    1排(0.00秒)

    SSL告诉服务器仅允许该帐户的SSL加密连接 . 在测试时授予所有特权 . *'root'@'localhost'
    要求SSL;
    要进行连接,客户端必须指定--ssl-ca选项来验证服务器证书,还可以指定--ssl-key和--ssl-cert选项 . 如果既未指定--ssl-ca选项也未指定--ssl-capath选项,则客户端不会对服务器证书进行身份验证 .


    备用链接:这里有冗长的教程http://www.madirish.net/214

  • 9

    oneliner v2017:

    centos:

    openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
    -keyout localhost.key -out localhost.crt \
    -days 3650 \
    -subj "CN=localhost" \
    -reqexts SAN -extensions SAN \
    -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
    

    ubuntu:

    openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
    -keyout localhost.key -out localhost.crt \
    -days 3650 \
    -subj "CN=localhost" \
    -reqexts SAN -extensions SAN \
    -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
    
  • 114

    如果缺少SAN(主题备用名称),现代浏览器现在会为其他格式良好的自签名证书抛出安全性错误 . OpenSSL does not provide a command-line way to specify this ,许多开发人员的教程和书签突然过时了 .

    再次运行的最快方法是一个简短的独立conf文件:

    • 创建OpenSSL配置文件(例如: req.cnf
    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
    • 创建引用此配置文件的证书
    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

    示例配置来自https://support.citrix.com/article/CTX135602

  • 64

    我错过了什么吗?这是构建自签名证书的正确方法吗?

    它很容易创建自签名证书 . 您只需使用 openssl req 命令 . 创建一个可以被最大的客户端选择(如浏览器和命令行工具)使用的方法可能很棘手 .

    它很难,因为浏览器有自己的一套要求,而且它们比IETF更具限制性 . 浏览器使用的要求记录在CA/Browser Forums(参见下面的参考资料) . 这些限制出现在两个关键领域:(1)信任锚,以及(2)DNS名称 .

    现代浏览器(如我们在2014/2015年使用的warez)需要一个链接回信任锚的证书,并且他们希望在证书中以特定方式呈现DNS名称 . 浏览器正在积极地反对自签名服务器证书

    某些浏览器并不能完全轻松导入自签名服务器证书 . 事实上,你不能用某些浏览器,比如Android的浏览器 . 所以完整的解决方案就是成为你自己的权威 .

    如果没有成为您自己的权限,您必须获得正确的DNS名称,以便为证书提供最大的成功机会 . 但我鼓励你成为自己的权威 . 它很容易成为你自己的权威,它将支持所有信任问题(谁比你自己更值得信任?) .


    这可能不是您要找的网站!该网站的安全证书不受信任!

    这是因为浏览器使用预定义的信任锚列表来验证服务器证书 . 自签名证书不会链回到受信任的锚点 .

    避免这种情况的最佳方法是:

    • 创建自己的权限(即成为CA)

    • 为服务器创建证书签名请求(CSR)

    • 使用CA密钥对服务器的CSR进行签名

    • 在服务器上安装服务器证书

    • 在客户端上安装CA证书

    步骤1 - 创建自己的权限只是意味着使用 CA: true 和正确的密钥用法创建自签名证书 . 这意味着Subject和Issuer是同一个实体,CA在Basic Constraints中设置为true(它也应该被标记为关键),密钥用法是 keyCertSigncrlSign (如果您使用的是CRL),以及主题密钥标识符(SKI) )与授权密钥标识符(AKI)相同 .

    要成为您自己的证书颁发机构,请参阅Stack Overflow上的How do you sign Certificate Signing Request with your Certification Authority? . 然后,将您的CA导入浏览器使用的Trust Store .

    当您获得CA的服务(如StartcomCAcert)时,步骤2 - 4大致就是面向公共服务器的操作 . 步骤1和5允许您避免第三方权限,并充当您自己的权限(谁比您自己更信任?) .

    避免浏览器警告的下一个最佳方法是信任服务器的证书 . 但有些浏览器,比如Android的默认浏览器,不允许你这样做 . 所以它永远不会在平台上运行 .

    不信任自签名证书的浏览器(和其他类似用户代理)的问题将成为物联网(IoT)中的一个大问题 . 例如,当您连接到恒温器或冰箱进行编程时会发生什么?答案是,就用户体验而言,没什么好处 .

    W3C的WebAppSec工作组正在开始研究这个问题 . 例如,参见Proposal: Marking HTTP As Non-Secure .


    如何使用openssl创建自签名证书?

    以下命令和配置文件创建自签名证书(它还向您显示如何创建签名请求) . 它们在一个方面与其他答案不同:用于自签名证书的DNS名称在主题备用名称(SAN)中,而不是公用名称(CN) .

    DNS名称通过配置文件放在SAN中,行号为 subjectAltName = @alternate_names (配置文件中有's no way to do it through the command line). Then there' s alternate_names 部分(您应该根据自己的喜好对其进行调整):

    [ alternate_names ]
    
    DNS.1       = example.com
    DNS.2       = www.example.com
    DNS.3       = mail.example.com
    DNS.4       = ftp.example.com
    
    # Add these if you need them. But usually you don't want them or
    #   need them in production. You may need them for development.
    # DNS.5       = localhost
    # DNS.6       = localhost.localdomain
    # DNS.7       = 127.0.0.1
    
    # IPv6 localhost
    # DNS.8     = ::1
    

    将DNS名称放在SAN而不是CN中非常重要,因为IETF和CA /浏览器论坛都指定了这种做法 . 它们还指定不推荐使用CN中的DNS名称(但不禁止) . 如果您在CN中放入DNS名称,则必须将其包含在SAN下CA / B策略 . 因此,您无法避免使用主题备用名称 .

    如果您没有在DNS中放置DNS名称,则证书将无法在遵循CA /浏览器论坛准则的浏览器和其他用户代理下进行验证 .

    相关:浏览器遵循CA /浏览器论坛政策;而不是IETF的政策 . 这是使用OpenSSL(通常遵循IETF)创建的证书有时不在浏览器下验证(浏览器遵循CA / B)的原因之一 . 它们是不同的标准,它们具有不同的发布策略和不同的验证要求 .


    Create a self signed certificate (注意添加 -x509 选项):

    openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
        -keyout example-com.key.pem -days 365 -out example-com.cert.pem
    

    Create a signing request (注意缺少 -x509 选项):

    openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
        -keyout example-com.key.pem -days 365 -out example-com.req.pem
    

    Print a self signed certificate

    openssl x509 -in example-com.cert.pem -text -noout
    

    Print a signing request

    openssl req -in example-com.req.pem -text -noout
    

    Configuration file (passed via -config option)

    [ req ]
    default_bits        = 2048
    default_keyfile     = server-key.pem
    distinguished_name  = subject
    req_extensions      = req_ext
    x509_extensions     = x509_ext
    string_mask         = utf8only
    
    # The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
    #   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
    [ subject ]
    countryName         = Country Name (2 letter code)
    countryName_default     = US
    
    stateOrProvinceName     = State or Province Name (full name)
    stateOrProvinceName_default = NY
    
    localityName            = Locality Name (eg, city)
    localityName_default        = New York
    
    organizationName         = Organization Name (eg, company)
    organizationName_default    = Example, LLC
    
    # Use a friendly name here because its presented to the user. The server's DNS
    #   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
    #   by both IETF and CA/Browser Forums. If you place a DNS name here, then you 
    #   must include the DNS name in the SAN too (otherwise, Chrome and others that
    #   strictly follow the CA/Browser Baseline Requirements will fail).
    commonName          = Common Name (e.g. server FQDN or YOUR name)
    commonName_default      = Example Company
    
    emailAddress            = Email Address
    emailAddress_default        = test@example.com
    
    # Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
    [ x509_ext ]
    
    subjectKeyIdentifier        = hash
    authorityKeyIdentifier  = keyid,issuer
    
    # You only need digitalSignature below. *If* you don't allow
    #   RSA Key transport (i.e., you use ephemeral cipher suites), then
    #   omit keyEncipherment because that's key transport.
    basicConstraints        = CA:FALSE
    keyUsage            = digitalSignature, keyEncipherment
    subjectAltName          = @alternate_names
    nsComment           = "OpenSSL Generated Certificate"
    
    # RFC 5280, Section 4.2.1.12 makes EKU optional
    #   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
    #   In either case, you probably only need serverAuth.
    # extendedKeyUsage  = serverAuth, clientAuth
    
    # Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
    [ req_ext ]
    
    subjectKeyIdentifier        = hash
    
    basicConstraints        = CA:FALSE
    keyUsage            = digitalSignature, keyEncipherment
    subjectAltName          = @alternate_names
    nsComment           = "OpenSSL Generated Certificate"
    
    # RFC 5280, Section 4.2.1.12 makes EKU optional
    #   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
    #   In either case, you probably only need serverAuth.
    # extendedKeyUsage  = serverAuth, clientAuth
    
    [ alternate_names ]
    
    DNS.1       = example.com
    DNS.2       = www.example.com
    DNS.3       = mail.example.com
    DNS.4       = ftp.example.com
    
    # Add these if you need them. But usually you don't want them or
    #   need them in production. You may need them for development.
    # DNS.5       = localhost
    # DNS.6       = localhost.localdomain
    # DNS.7       = 127.0.0.1
    
    # IPv6 localhost
    # DNS.8     = ::1
    

    您可能需要为Chrome执行以下操作 . 否则Chrome may complain a Common Name is invalid (ERR_CERT_COMMON_NAME_INVALID) . 我不确定SAN中的IP地址与此实例中的CN之间的关系 .

    # IPv4 localhost
    # IP.1       = 127.0.0.1
    
    # IPv6 localhost
    # IP.2     = ::1
    

    关于X.509 / PKIX证书中DNS名称的处理还有其他规则 . 有关规则,请参阅这些文档:

    列出了RFC 6797和RFC 7469,因为它们比其他RFC和CA / B文档更具限制性 . RFC的6797和7469也不允许使用IP地址 .

  • 5

    2017年一个班轮:

    openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.pem \
    -new \
    -out server.pem \
    -subj /CN=localhost \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
    -sha256 \
    -days 3650
    

    这也适用于Chrome 57,因为它提供了SAN,而没有其他配置文件 . 取自答案here . 这将创建一个包含私钥和证书的.pem文件 . 如果需要,您可以将它们移动到单独的.pem文件中 .

相关问题