【问题标题】:SSL certificate issue: self signed certificateSSL 证书问题:自签名证书
【发布时间】:2018-04-17 12:47:40
【问题描述】:

当我向我的专用服务器发出 https 请求时,我在验证我的证书时遇到了问题

我运行这个命令来创建我的证书和我的私钥:

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

当我运行命令以查看证书和密钥是否匹配时,它们匹配

然后,我已经设置了我的 ssl 服务器:

server {

# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
server_name mydomain.com;
ssl on;
ssl_certificate           /pathtocert.pem;
ssl_certificate_key       /pathtokey.pem;
client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
ssl_password_file         /pathtopassphrase.txt;

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /pathtocert.pem;
# Google DNS, Open DNS, Dyn DNS
resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 216.146.35.35 216.146.36.36 valid=300s;
resolver_timeout 3s;

但是当我执行我的 curl 请求时:

// OPTIONS:
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
  "APIKEY: " . self::APIKEY,
  'Content-Type: application/json',
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, public_path() . "\CA\Something.crt");

// EXECUTE:
$result = curl_exec($curl);

我收到如下证书问题:

SSL:无法从对等证书中获取公用名

我必须简单地保护我的 API,这是我的目标。

【问题讨论】:

    标签: php ssl curl nginx openssl


    【解决方案1】:

    我正在使用这些命令进行创建,并且每次都对我有用。

    $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
    $ openssl rsa -passin pass:x -in server.pass.key -out server.key
    $ rm server.pass.key
    $ openssl req -new -key server.key -out server.csr
    $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    

    这是我的 nginx.conf

    server {
        listen 443 default_server ssl http2;
    
        server_name IP_ADRESS;
    
        ssl_certificate /home/NAMEOFCOMPUTER/keys/server.crt;
        ssl_certificate_key /home/NAMEOFCOMPUTER/keys/server.key;
        ssl_session_cache shared:SSL:10m;
    
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/htpasswd.kibana;
    
        location / {
            proxy_pass http://localhost:5601;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
    

    【讨论】:

    • 其实步骤 1 到 4 可以使用:openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr
    • 好的,我已经通过浏览器下载了证书,现在我又遇到了一个问题:SSL: certificate subject name does not match target host name
    • 您是在尝试使用 IP 地址还是主机名访问?
    • 通过主机名,谢谢,我明白了:我已经通过重新创建我的证书并更改通用名称以匹配我的主机名来解决
    • “我通过重新创建我的证书并更改公用名以匹配我的主机名来解决...” - CN=www.example.com 可能是错误的。主机名始终位于 SAN 中。如果它出现在 CN 中,那么它也必须出现在 SAN 中(在这种情况下您必须列出两次)。有关更多规则和原因,请参阅How to create a self-signed certificate with openssl? 您还需要将自签名证书放在适当的信任库中。
    猜你喜欢
    • 2019-12-11
    • 2020-09-20
    • 2018-11-16
    • 2021-02-14
    • 2021-02-20
    • 2017-04-18
    • 1970-01-01
    • 2022-01-26
    • 2021-08-07
    相关资源
    最近更新 更多