我正在为嵌入式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上遇到了一些错误:

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

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


当前回答

生成密钥我将/etc/mysql用于证书存储,因为/etc/appamor.d/usr.sbin.mysqld包含/etc/mysql/*.pem r。苏多苏-cd/etc/mysqlopenssl 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-天1000-节点-keyout server-key.pem-out server-req.pem;openssl x509-req-in server-req.pem-天1000-CA CA-cert.pem-CA密钥CA-key.pem-set_serial 01-out server-cert.pum;openssl req-newkey rsa:2048-天1000-nodes-keyout client-key.pem-out client-req.pem;openssl x509-req-in client-req.pem-days 1000-CA CA-cert.pem-CA密钥CA-key.pem-set_serial 01-out client-cert.pum;添加配置/etc/mysql/my.cnf[客户]ssl-ca=/etc/mysql/ca-cert.pemssl证书=/etc/mysql/client-cert.pemssl密钥=/etc/mysql/client-key.pem[mysqld]ssl-ca=/etc/mysql/ca-cert.pemssl证书=/etc/mysql/server-cert.pemssl密钥=/etc/mysql/server-key.pem

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

后续注意事项:

SSL错误:无法从“…”获取证书如果MySQL不在appmors配置中,则可能会拒绝对证书文件的读取访问。如前面步骤^中所述,将所有证书保存为/etc/mysql/目录中的.pem文件,appamor默认批准该目录(或修改appamor/SELinux以允许访问存储它们的任何位置)SSL错误:无法获取私钥您的MySQL服务器版本可能不支持默认的rsa:2048格式将生成的rsa:2048转换为纯rsa:openssl rsa-in server-key.pem-out server-key.phpopenssl rsa-in client-key.pem-out client-key.php检查本地服务器是否支持SSL:mysql-u根-pmysql>显示变量,如“%ssl%”;+---------------+----------------------------+|变量名称|值|+---------------+----------------------------+|have_openssl|是||have_ssl|是||ssl-ca|/etc/mysql/ca-cert.pem||ssl_容量|||ssl_cert |/etc/mysql/server-cert.pem||ssl_密码|||ssl-key |/etc/mysql/server-key.pem|+---------------+----------------------------+验证与数据库的连接是否经过SSL加密:正在验证连接登录到MySQL实例时,可以发出查询:显示状态,如“Ssl_cypher”;如果您的连接未加密,结果将为空:mysql>显示状态,如“Ssl_cypher”;+---------------+-------+|变量名称|值|+---------------+-------+|Ssl_密码||+---------------+-------+一组1行(0.00秒)否则,它将显示正在使用的密码的非零长度字符串:mysql>显示状态,如“Ssl_cypher”;+---------------+--------------------+|变量名称|值|+---------------+--------------------+|Ssl_密码|DHE-RSA-AES256-SHA|+---------------+--------------------+一组1行(0.00秒)特定用户的连接需要ssl(“需要ssl”):安全套接字层告诉服务器只允许帐户使用SSL加密连接。授予测试的所有特权。*至“root”@“本地主机”需要SSL;要进行连接,客户端必须指定--ssl ca选项来验证服务器证书,还可以指定--ssl密钥和--ssl证书选项。如果未指定--ssl ca选项或--ssl capath选项,则客户端不会对服务器证书进行身份验证。


备用链接:《用SSL保护PHP与MySQL的连接》中的冗长教程。

其他回答

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

此脚本采用域名(example.com)并在同一证书中为*.example.com和example.com生成SAN。对以下各节进行了评论。为脚本命名(例如generatessl.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)服务器以使新证书生效。

快速命令行:最低版本

“我想要一个pfx格式的自签名证书,用于www.example.com,且不会引起太大的麻烦”:

openssl req -x509 -sha256 -days 365 -nodes -out cert.crt -keyout cert.key -subj "/CN=www.example.com"
openssl pkcs12 -export -out cert.pfx -inkey cert.key -in cert.crt

一个内衬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"

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

>>更多信息请点击此处<<

生成10年无密码和证书的密钥,短方法:

openssl req  -x509 -nodes -new  -keyout server.key -out server.crt -days 3650 -subj "/C=/ST=/L=/O=/OU=web/CN=www.server.com"

对于标志-subj |,允许使用subject空值-subj“/C=/ST=/L=/O=/OU=web/CN=www.server.com”,但可以根据需要设置更多详细信息:

C-国家名称(2字母代码)ST-状态L-地点名称(如城市)O-组织名称OU-组织单位名称CN-通用名称-必填!

我不能评论,所以我将把这作为一个单独的答案。我发现了一些公认的单线回答的问题:

一行代码在密钥中包含一个口令。一行程序使用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