我没有主意,需要帮助!
我使用Openssl创建SSL:
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 3650
cert.pem看起来像这样:
-----BEGIN CERTIFICATE-----
cert
-----END CERTIFICATE-----
key.pem看起来像这样:
-----BEGIN PRIVATE KEY-----
key
-----END PRIVATE KEY-----
在docker-compose中,我已将证书/密钥发送到etc / nginx / ssl /...
volumes:
- ./sites:/etc/nginx/conf.d
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./ssl/cert.pem:/etc/nginx/ssl/cert.pem
- ./ssl/key.pem:/etc/nginx/ssl/key.pem
在nginx中,我像这样添加了它:
listen 443 ssl;
server_name localhost;
ssl_certificate ssl/cert.pem;
ssl_certificate_key ssl/key.pem;
当我启动docker-compose时,出现了Nginx错误:
web_1 | 2018/08/17 16:38:47 [emerg] 1#1: PEM_read_bio_X509_AUX("/etc/nginx/ssl/cert.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)
web_1 | nginx: [emerg] PEM_read_bio_X509_AUX("/etc/nginx/ssl/cert.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)
我已经为此工作了几天,但我不确定为什么会不断收到此错误。我尝试使它成为crt / key而不是.pem,并且出现相同的错误。如果我只是一起删除ssl,则服务器工作正常,但我非常需要SSL。 Pleeeaaase帮助!
答案 0 :(得分:2)
一旦以PEM编码,“正常”证书将如下所示:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
(...
是DER
结构的Base64编码)
这通常是(具有关联的密钥,通常在单独的文件中)任何启用了TLS的应用程序想要向远端显示其身份时所需的东西。
作为一个旁注,由于它似乎很流行(错误),因此文件名本身(包括扩展名)对内容的正常工作(或不正常)没有任何影响。您可以为文件foobar.42
和buzz.666
命名,如果它们的内容有效,它们也可以正常工作...当然,人工维护会比较困难,因此惯例通常将.crt
用于证书(对于非基于DOS的受约束环境,通常使用.cert
;对于密钥文件,则使用.key
);通常使用网站名称(对于网站)或其中的一部分它的名称,例如example.com.crt
。
但是,这些只是一组可能的约定,需要这些文件的任何程序都不关心名称,而只关心内容。
有些人也在使用.pem
扩展名。
以上所有内容,请参见https://en.wikipedia.org/wiki/X.509#Certificate_filename_extensions,其中对选项进行了很好的讨论/介绍。
现在,在您的情况下,错误消息告诉您它应该具有这样的内容:
-----BEGIN TRUSTED CERTIFICATE-----
...
-----END TRUSTED CERTIFICATE-----
唯一的区别是添加了TRUSTED
关键字。但是为什么?何时发生?
证书由一个“证书颁发机构”通过一个或多个中间体签名。这样就建立了一个根证书的信任链,在该证书的颁发者等于主题的情况下,该证书会对其进行签名。
您自己生成了证书,因此这是一个“自签名”证书,从技术上讲与CA证书没有区别,只是默认情况下没有任何系统(包括您自己的系统)会在没有特定配置的情况下信任该证书。
这基本上是错误消息告诉您的内容:应用程序说它正在根据您无法验证(因为它是自签名)的配置加载证书,与此同时,您也没有明确配置它以信任它。
根据应用程序或其版本,这可能有所不同,因为https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04上的指南与您所做的基本上相同,但是它没有显示证书的内容。
在您的openssl
呼叫中,如果添加-trustout
,它将生成BEGIN TRUSTED CERTIFICATE
而不是BEGIN CERTIFICATE
。默认情况下,也可能会发生这种情况,具体取决于系统上openssl的安装/配置方式。相反,您有-clrtrust
。
请参见https://www.openssl.org/docs/man1.1.0/apps/x509.html
openssl
x509
命令的“信任设置”部分
答案 1 :(得分:2)
只是扩展@patrick 的答案,此命令可用于将 trusted 证书转换为 normal 证书。
public function columns_renderer()
{
$allowedBlocks = ["acf/theme-column"];
$template = array(
array('acf/biore-column', []),
);
$column_count = get_field("columns-count");
?>
<div class="row py-4">
<?php for($i = 0; $i < $column_count; $i++): ?>
<div class="col">
<InnerBlocks allowedBlocks="<?= esc_attr(wp_json_encode($allowedBlocks)); ?>" template="<?= esc_attr(wp_json_encode($template)); ?>" />
</div>
<?php endfor; ?>
</div>
<?php
}
注意:如果您的源文件中有多个证书(上例中的 $ openssl x509 -in trusted.pem -clrtrust -out normal.pem
),那么您必须对所有证书执行相同的操作。
答案 2 :(得分:1)
我今天偶然发现了“ Expecting: TRUSTED CERTIFICATE
”问题,发现就我而言,这是由于文件编码引起的。
我删除了从PFX到PEM转换的标题行,因此文件将以-----BEGIN CERTIFICATE-----
开头。
默认情况下,Powershell Out-File
将文件存储为 UTF8NoBOM 。
此后,OpenSSL无法读取文件,直到我将其更改为 ASCII 编码(通过使用Out-File -Encoding ascii
)