如何使用OpenSSL创建自签名证书
我正在向嵌入式Linux设备添加HTTPS支持。我尝试通过以下步骤生成自签名证书:openssl req -new > cert.csropenssl rsa -in privke
我正在向嵌入式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
这可行,但是我遇到了一些错误,例如Google Chrome:
这可能不是您要查找的网站!
该站点的安全证书不受信任!
我想念什么吗? 这是构建自签名证书的正确方法吗?
#1楼
您可以通过以下命令执行此操作:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
如果您不想使用密码来保护私钥,也可以添加-nodes
( no DES
缩写)。 否则,它将提示您输入“至少4个字符”的密码。
您可以用任何数字替换days
参数(365)以影响到期日期。 然后,它将提示您输入“国家名称”之类的内容,但是您只需按Enter并接受默认值即可。
添加-subj '/CN=localhost'
以取消有关证书内容的问题(将localhost
替换为所需的域)。
除非您以前将自签名证书导入浏览器,否则它们不会与任何第三方进行验证。 如果需要更高的安全性,则应使用由证书颁发机构 (CA)签名的证书 。
#2楼
这是@diegows的答案中描述的选项,从文档中进行了更详细的描述 :
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req
PKCS#10证书申请和证书生成实用程序。
-x509
此选项输出自签名证书而不是证书请求。 通常用于生成测试证书或自签名的根CA。
-newkey arg
此选项创建一个新的证书请求和一个新的私钥。 该参数采用以下几种形式之一。 rsa:nbits (其中nbits是位数)会生成nbits大小的RSA密钥。
-keyout filename
这给出了将新创建的私钥写入的文件名。
-out filename
默认指定要写入的输出文件名或标准输出。
-days n
当使用-x509选项时,它指定认证证书的天数。 默认值为30天。
-nodes
如果指定了此选项,则如果创建了私钥,则不会对其进行加密。
该文档实际上比上述文档更详细; 我在这里总结一下。
#3楼
我建议添加-sha256参数,以使用SHA-2哈希算法,因为主要的浏览器都在考虑将“ SHA-1证书”显示为不安全。
来自接受的答案的相同命令行-@diegows添加了-sha256
openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
有关更多信息,请访问Google安全性博客 。
更新于2018年5月。正如评论中许多指出的那样,使用SHA-2不会为自签名证书添加任何安全性。 但是我仍然建议使用它作为不使用过时/不安全的加密哈希函数的好习惯。 有关为什么完整证书的解释完全可以理解为基于SHA-1的最终实体证书之上的证书? 。
#4楼
我想念什么吗? 这是构建自签名证书的正确方法吗?
创建自签名证书很容易。 您只需要使用openssl req
命令。 创建一个可供最多客户选择的客户端(例如浏览器和命令行工具)使用的客户端可能很棘手。
这很困难,因为浏览器有自己的一套要求,并且比IETF更具限制性。 浏览器使用的要求记录在CA /浏览器论坛中 (请参阅下面的参考资料)。 限制出现在两个关键领域:(1)信任锚,和(2)DNS名称。
现代浏览器(例如我们在2014/2015年使用的warez)需要一个链接回信任锚的证书,并且他们希望DNS名称以特定方式显示在证书中。 浏览器正在积极反对自签名服务器证书。
某些浏览器不能完全轻松地导入自签名服务器证书。 实际上,您无法使用某些浏览器,例如Android的浏览器。 因此,完整的解决方案是成为您自己的权威。
如果没有自己的权限,则必须正确设置DNS名称,以使证书获得最大的成功机会。 但是我鼓励你成为自己的权威。 成为您自己的权威很容易,它将回避所有信任问题(谁比自己更信任?)。
这可能不是您要查找的网站!
该站点的安全证书不受信任!
这是因为浏览器使用预定义的信任锚列表来验证服务器证书。 自签名证书不会链接回受信任的锚。
避免这种情况的最佳方法是:
- 创建您自己的权限(即成为CA )
- 为服务器创建证书签名请求(CSR)
- 使用您的CA密钥签署服务器的CSR
- 在服务器上安装服务器证书
- 在客户端上安装CA证书
第1步- 创建您自己的权限仅意味着创建带有CA: true
的自签名证书CA: true
且正确的密钥用法。 这意味着主题和颁发者是同一实体,在“ 基本约束”中将CA设置为true(也应将其标记为关键),密钥用法为keyCertSign
和crlSign
(如果使用的是CRL),以及主题密钥标识符 (SKI) )与授权机构密钥标识符 (AKI)相同。
要成为自己的证书颁发机构,请参阅* 如何与证书颁发机构签署证书签名请求? 在堆栈溢出。 然后,将您的CA导入浏览器使用的信任库中。
当您征求诸如Startcom或CAcert之类的CA服务时,步骤2-4大致就是您现在要对面向公众的服务器执行的操作。 步骤1和5使您可以避开第三方权限,而充当自己的权限(谁比自己更信任?)。
避免浏览器警告的下一个最佳方法是信任服务器的证书。 但是某些浏览器(例如Android的默认浏览器)不允许您这样做。 因此它将永远无法在平台上运行。
浏览器(和其他类似的用户代理) 不信任自签名证书的问题将在物联网(IoT)中成为一个大问题。 例如,当您连接恒温器或冰箱进行编程时会发生什么? 答案是,就用户体验而言,没有任何好处。
W3C的WebAppSec工作组开始研究此问题。 例如,参见提案:将HTTP标记为不安全 。
如何使用OpenSSL创建自签名证书
下面的命令和配置文件将创建一个自签名证书(还显示了如何创建签名请求)。 它们在一个方面与其他答案有所不同:用于自签名证书的DNS名称在主题备用名称(SAN)中 ,而不是通用名称(CN)中 。
DNS名称通过配置文件放置在SAN中,其行为subjectAltName = @alternate_names
(无法通过命令行进行操作)。 然后在配置文件中有一个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
# IP.1 = 127.0.0.1
# IP.2 = ::1
把DNS名称的SAN,而不是在CN,因为无论是IETF和CA /浏览器论坛指定的做法是很重要的。 他们还指定CN中的DNS名称已弃用(但不禁止)。 如果将DNS名称放在CN中,则必须在CA / B策略下将其包含在SAN中。 因此,您不可避免地要使用主题备用名称。
如果不将DNS名称放入SAN,则证书将无法在遵循CA / Browser Forum指南的浏览器和其他用户代理下进行验证。
相关:浏览器遵循CA / Browser论坛策略; 而不是IETF政策。 这就是使用OpenSSL创建的证书(通常遵循IETF)有时无法在浏览器下进行验证的原因之一(浏览器遵循CA / B)。 它们是不同的标准,它们具有不同的发行策略和不同的验证要求。
创建一个自签名证书 (注意增加了-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
创建一个签名请求 (注意缺少-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
打印自签名证书 :
openssl x509 -in example-com.cert.pem -text -noout
打印签名请求 :
openssl req -in example-com.req.pem -text -noout
配置文件(通过-config
选项传递)
[ 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 it's 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可能会抱怨公用名无效( 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 5280, Internet X.509公钥基础结构证书和证书吊销列表(CRL)配置文件
- RFC 6125, 在传输层安全性(TLS)上下文中使用X.509(PKIX)证书在Internet公钥基础结构中基于域的应用程序服务标识的表示和验证
- RFC 6797,附录A, HTTP严格传输安全性(HSTS)
- RFC 7469, HTTP的公钥固定扩展
- CA /浏览器论坛基准要求
- CA /浏览器论坛扩展验证指南
列出了RFC 6797和RFC 7469,因为它们比其他RFC和CA / B文档更具限制性。 RFC 6797和7469 也不允许IP地址。
#5楼
您的一般程序正确。 该命令的语法如下。
openssl req -new -key {private key file} -out {output file}
但是,显示警告,因为浏览器无法通过使用已知的证书颁发机构(CA)验证证书来验证标识。
由于这是自签名证书,因此没有CA,您可以放心地忽略该警告并继续进行。 如果您想获得可以被公共Internet上的任何人识别的真实证书,请按照以下步骤操作。
- 生成私钥
- 使用该私钥创建CSR文件
- 将CSR提交给CA(Verisign或其他)
- 在Web服务器上安装从CA收到的证书
- 根据证书类型将其他证书添加到身份验证链中
我在保护连接安全:使用OpenSSL创建安全证书的文章中对此有更多详细信息。
#6楼
我无法发表评论,因此我将其作为一个单独的答案。 我发现了公认的一线回答的一些问题:
- 单行代码在密钥中包含一个密码短语。
- 单线使用SHA-1,SHA-1在许多浏览器中都会在控制台中引发警告。
这是一个简化的版本,它删除了密码短语,提高了安全性以抑制警告,并在注释中包含建议以传递-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
#7楼
产生金钥
我将
/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-cert=/etc/mysql/client-cert.pem ssl-key=/etc/mysql/client-key.pem [mysqld] ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
在我的设置中,Ubuntu服务器登录到: /var/log/mysql/error.log
跟进注意事项:
SSL error: Unable to get certificate from '...'
如果未处于apparmors配置中,则MySQL可能被拒绝对您的证书文件进行读取访问 。 如前面的步骤^所述,将所有证书另存为
.pem
文件到/etc/mysql/
目录中,该文件由apparmor缺省批准(或修改apparmor / SELinux以允许访问存储它们的任何位置。)SSL error: Unable to get private key
您的MySQL服务器版本可能不支持默认的
rsa:2048
格式使用以下命令将生成的
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> show variables like "%ssl%"; +---------------+----------------------------+ | Variable_name | Value | +---------------+----------------------------+ | have_openssl | YES | | have_ssl | YES | | 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实例后,可以发出查询:
show status like 'Ssl_cipher';
如果您的连接未加密,结果将为空白:
mysql> show status like 'Ssl_cipher'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Ssl_cipher | | +---------------+-------+ 1 row in set (0.00 sec)
否则,它将为使用的密码显示一个非零长度的字符串:
mysql> show status like 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES256-SHA | +---------------+--------------------+ 1 row in set (0.00 sec)
需要ssl来连接特定用户 ('require ssl'):
- SSL协议
告诉服务器仅允许该帐户的SSL加密连接。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' REQUIRE SSL;
要进行连接,客户端必须指定--ssl-ca选项来认证服务器证书,并且可以另外指定--ssl-key和--ssl-cert选项。 如果未指定--ssl-ca选项和--ssl-capath选项,则客户端不会对服务器证书进行身份验证。
备用链接: 使用SSL到MySQL的安全PHP连接中的冗长教程。
#8楼
截至2019年,以下命令可满足您的所有需求,包括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,IP:10.0.0.1
) \
-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,IP:10.0.0.1
它创建的证书是
- 对域
example.com
和example.net
(SAN)有效, - 对于IP地址
10.0.0.1
(SAN)也有效, - 相对强劲(截至2019年)
- 有效期为
3650
天(〜10年)。
它创建以下文件:
- 私钥:
example.key
- 证书:
example.crt
所有信息都在命令行中提供。 没有让您烦恼的交互式输入 。 没有您需要弄乱的配置文件 。 所有必要的步骤都由一个OpenSSL调用执行:从私钥生成到自签名证书。
备注1:加密参数
由于证书是自签名的,需要用户手动接受,因此使用短有效期或弱加密是没有意义的。
将来,您可能想使用4096
位以上的RSA密钥和比sha256
更强的哈希算法,但从2019年开始,这些值是合理的。 它们足够强大,同时得到所有现代浏览器的支持。
备注#2:参数“ -nodes
”
从理论上讲,您可以-nodes
参数(这意味着“不进行DES加密”),在这种情况下, example.key
将使用密码进行加密。 但是,这对于服务器安装几乎几乎没有用,因为您要么必须将密码也存储在服务器上,要么必须在每次重新启动时手动输入密码。
备注3:MinGW
在Windows上的MinGW bash中,应在命令前加上MSYS_NO_PATHCONV=1
:
MSYS_NO_PATHCONV=1 openssl ...
或者,在纯cmd.exe
Windows命令提示符下运行命令。
备注4:另请参见
#9楼
现在,现代浏览器如果缺少SAN(主题备用名称),则会为原本格式正确的自签名证书引发安全错误。 OpenSSL没有提供指定此功能的命令行方式 ,因此许多开发人员的教程和书签突然过时了。
重新运行的最快方法是一个简短的独立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的示例配置
#10楼
这是我在本地计算机上使用的脚本,用于在自签名证书中设置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"
该脚本还会写入信息文件,因此您可以检查新证书并验证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)服务器,以使新证书生效。
#11楼
一班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"
该命令包含您通常会提供的有关证书详细信息的所有答案。 这样,您可以设置参数并运行命令,获取输出-然后去喝咖啡。
#12楼
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,而没有其他配置文件。 它是从这里的答案中提取的。
这将创建一个同时包含私钥和证书的.pem文件。 如果需要,可以将它们移动到单独的.pem文件中。
#13楼
一线版2017:
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"))
编辑:为Ubuntu添加了前置斜杠到'subj'选项。
#14楼
如已经详细讨论的那样, 自签名证书 不受Internet信任 。 您可以将自签名证书添加到许多(但不是全部)浏览器中 。 或者,您可以成为自己的证书颁发机构 。
不想从证书颁发机构获得签名证书的主要原因是成本- 赛门铁克每年收取995美元至1,999美元的证书费用-仅针对内部网络证书,赛门铁克每年收取399美元 。 如果您正在处理信用卡付款或为一家高利润公司的利润中心工作,那么这一成本很容易得到证明。 对于一个人正在互联网上创建的个人项目,或者对于以最低预算运行的非营利组织,或者如果一个人在组织的成本中心内工作,许多人买不起,成本中心总是尽力而为用更少。
一种替代方法是使用certbot (请参阅certbot )。 Certbot是一个易于使用的自动客户端,可为您的Web服务器获取和部署SSL / TLS证书。
如果您设置certbot,则可以启用它来创建和维护由Let's Encrypt证书颁发机构颁发的证书。
我在周末为我的组织这样做。 我在服务器(Ubuntu 16.04)上安装了certbot所需的软件包,然后运行了设置和启用certbot所需的命令。 一个可能需要certbot的DNS插件 -我们目前正在使用DigitalOcean,尽管可能很快会迁移到另一服务。
请注意,其中的某些说明不太正确,需要花点时间和Google一起弄清楚。 这是我第一次花费大量时间,但现在我想我可以在几分钟内完成。
对于DigitalOcean,我遇到的一个难题是当系统提示我输入指向DigitalOcean凭据INI文件的路径时。 该脚本所指的是“ 应用程序和API”页面以及该页面上的“令牌/密钥”选项卡。 您需要具有或生成DigitalOcean API的个人访问令牌(读写)-这是一个65个字符的十六进制字符串。 然后,需要将此字符串放入运行certbot的Web服务器上的文件中。 该文件的第一行可以带有注释(注释以#开头)。 第二行是:
dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff
一旦我弄清楚如何为DigitalOcean的API设置读写令牌,就可以使用certbot轻松设置通配符证书 。 请注意,不必设置通配符证书,而可以指定希望证书应用于的每个域和子域。 这是通配符证书,它要求包含来自DigitalOcean的个人访问令牌的凭据INI文件。
请注意,公钥证书(也称为身份证书或SSL证书)已过期,需要更新。 因此,您将需要定期(重复)更新证书。 certbot文档涵盖了续订证书 。
我的计划是编写一个脚本,以使用openssl命令获取证书的到期日期,并在30天或更短的时间内触发证书更新直到到期。 然后,我将该脚本添加到cron并每天运行一次。
这是读取证书的到期日期的命令:
root@prod-host:~# /usr/bin/openssl x509 -enddate -noout -in path-to-certificate-pem-file
notAfter=May 25 19:24:12 2019 GMT
更多推荐
所有评论(0)