Certificate 具有使用者替代名称的OpenSSL证书(版本3)

Certificate 具有使用者替代名称的OpenSSL证书(版本3),certificate,openssl,x509,pki,Certificate,Openssl,X509,Pki,我正在使用OpenSSL命令行工具生成一个自签名证书。除了两个问题外,它似乎工作正常。我无法使用主题替代名称(关键)创建.cer,我还无法确定如何创建版本3的证书(不确定这是否关键,但希望学习如何设置版本) 有人成功地做到了吗?默认配置(.cfg)文件似乎有清晰的文档(见下文): 这东西是给subjectAltName和issuerAltname的。 导入电子邮件地址。 subjectAltName=电子邮件:复制 然而,这不起作用。我的直觉是,主题替代名称没有显示在b/c中,它在V1规范中不存

我正在使用OpenSSL命令行工具生成一个自签名证书。除了两个问题外,它似乎工作正常。我无法使用主题替代名称(关键)创建
.cer
,我还无法确定如何创建版本3的证书(不确定这是否关键,但希望学习如何设置版本)

有人成功地做到了吗?默认配置(
.cfg
)文件似乎有清晰的文档(见下文):

这东西是给subjectAltName和issuerAltname的。 导入电子邮件地址。 subjectAltName=电子邮件:复制

然而,这不起作用。我的直觉是,主题替代名称没有显示在b/c中,它在V1规范中不存在,这就是为什么我也在追求设置版本的原因

下面是我正在使用的配置文件:

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
emailAddress        = myEmail@email.com
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:myEmail@email.com
issuerAltName          = issuer:copy

我将其用于以下版本(emailAddress的位置不正确):

注:

  • 要生成我使用的证书,请执行以下操作:

    openssl req -config req.cnf -new -nodes -out req.pem -x509
    
  • 我没有看到
    issueratname
    有多大用处(如果有,我想知道在哪里)
  • 对于
    authorityKeyIdentifier
    ,不建议使用
    issuer:always
  • 使用
    email:copy
    现在可以使用
    subjectAltName
  • v3_请求
    部分是多余的(以及
    req_扩展
    行)

您使用了什么命令来发出CSR证书请求?您使用了什么命令来生成证书文件?您知道的不同情况下的不同答案

也许你没有把

subjectAltName=电子邮件:复制

在节中

[v3_请求]

可能您正在使用openssl x509生成证书,如果是这样,您必须使用

-extfile/etc/pki/tls/openssl.cnf

因为没有这个,它就不会使用你的配置文件

您可能还需要

-扩展v3_请求


命令行开关这里是简单的步骤

生成CSR时,应使用
-config
-extensions
在生成证书时,您应该使用
-extfile
-extensions

以下是一个例子:

openssl-req-new-nodes-keyout-test.key-out-test.csr-days 3650-subc”/C=US/ST=SCA/L=SCA/O=Oracle/OU=Java/CN=test cert-config/etc/pki/tls/openssl.cnf-extensions v3_-req
openssl x509-req-days 3650-in test.csr-CA cacert.pem-CAkey rootCA.key-CAcreateserial-out test.pem-extfile/etc/pki/tls/openssl.cnf-extensions v3_-req
希望这有帮助

我刚刚开发了一个基于表单输入自动生成此命令并显示输出的程序


更新:请参阅

它变得如此受欢迎,以至于我改进了它,并以它自己的域名发布了它

它不仅提供可下载的.csr,还提供用于生成它的openssl命令,以及所需的openssl.cnf配置选项

示例:

OpenSSL命令

#generate the RSA private key
openssl genpkey -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.key

#Create the CSR
openssl req -new -nodes -key priv.key -config csrconfig.txt -out cert.csr
OpenSSL CSR配置

[ req ]
default_md = sha256
prompt = no
req_extensions = req_ext
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
commonName = example.com
countryName = US
stateOrProvinceName = Louisiana
localityName = Slidell
organizationName = Acme Inc.
[ req_ext ]
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=critical,serverAuth,clientAuth
subjectAltName = @alt_names
[ alt_names ]
IP.0 = 1.1.1.1
IP.1 = 2.2.2.2
DNS.0 = server1.example.com
DNS.1 = server2.example.com
email.0 = email1@example.com
email.1 = email2@example.com

配置文件中的条目
subjectAltName
需要
v3_-req

openssl x509 ... -extfile openssl.cnf -extensions v3_req

将把SAN插入证书。

我知道这个线程有点旧,但为了防止它在windows上对任何人都有效,请检查文件是否为UTF-8编码,在我的情况下,我收到一个错误,表明.cnf文件有错误,所以我在记事本上打开了它++将文件编码设置为UTF-8,保存并运行openssl逗号第二次,它成功了。

好吧,这页上的其他答案对我都不起作用,我尝试了所有答案。对我起作用的是一个小把戏:

申请证书时:

-config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-reqexts SAN
-extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-extensions SAN
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost:443;

    ssl_certificate /etc/ssl/certs/Some-Server.crt;
    ssl_certificate_key /etc/ssl/private/Some-Server.key;
    ssl_dhparam /etc/ssl/certs/https-dhparam.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
然后,我们可以验证受试者备选名称是否在最终证书中:

openssl x509 -in Some-Server.crt -text -noout
相关章节为:

    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:Some-Server
这是一个证书,只要您在浏览器中安装证书颁发机构,每个主要浏览器(包括chrome)都会接受它。这是您需要安装的
ca-cert.crt

以下是允许您使用证书的nginx配置示例:

-config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-reqexts SAN
-extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-extensions SAN
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost:443;

    ssl_certificate /etc/ssl/certs/Some-Server.crt;
    ssl_certificate_key /etc/ssl/private/Some-Server.key;
    ssl_dhparam /etc/ssl/certs/https-dhparam.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

我参考了几页,其中最重要的帮助来自1、2(请参阅user40662的答案)和3.Raghu K Nair关于命令使用的答案

然后我成功的尝试:

san.cnf

[ req ]
default_bits       = 2048
default_md         = sha256
distinguished_name = req_distinguished_name
req_extensions     = v3_req
[ req_distinguished_name ]
countryName            = CN                     # C=
stateOrProvinceName    = Shanghai               # ST=
localityName           = Shanghai               # L=
#postalCode             = 200000                 # L/postalcode=
#streetAddress          = "My Address"           # L/street=
organizationName       = My Corporation         # O=
organizationalUnitName = My Department          # OU=
commonName             = myname.mysoftware.mycorporation.com # CN=
emailAddress           = myname@example.com     # CN/emailAddress=
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1   = myname.mysoftware.mycorporation.com
#DNS.2   = other2.com
#DNS.3   = other3.com
命令:

openssl req -x509 -nodes -days 365 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=My Corporation/OU=My Department/CN=myname.mysoftware.mycorporation.com/emailAddress=myname@example.com" -keyout privateKey.pem -out certificate.crt -config san.cnf -extensions v3_req
!/bin/dash
#步骤1-3显示了如何使用openssl创建证书请求
#这包括受试者的备选名称。
#在创建自己的CA的罕见情况下,请执行步骤4-6
#演示如何使用openssl创建CA,然后使用该CA
#根据请求创建证书。
#步骤1:创建OpenSSL配置文件
#指定主题替代名称的步骤
回显;回显“步骤1”

cat>foo.cnf Nice脚本在除android之外的任何地方都可以使用。=(当您尝试安装crt时,android会出现以下错误“需要安装私钥”@杰克·戴维森:你的脚本似乎有
/bin/bash
风格的输入重定向。例如:
-config上面,不要在
-config'@rgov中加单引号-谢谢你注意到了这一点。我更新了answerVery不错的解决方案,CA密码只在密钥创建过程中使用,然后被丢弃。更安全,谢谢!我尝试过了,这是可行的,但是使用
节点
选项(步骤4)生成的CA留下了一个打开的安全漏洞,我认为…@Will59-未加密的私钥是否是“安全漏洞”取决于(IMO)脚本中的注释清楚地说明了
-nodes
的后果。如果您需要加密的私钥,请根据需要进行调整。如果您正在创建自己的CA,希望您有足够的背景知识来理解