在实现客户端 TLS 证书时,浏览器总是会弹出一个包含可用(和可能合适的?)证书的弹出窗口。
服务器有没有办法请求浏览器立即提供的特定证书而不通过弹出窗口?
关于客户端身份验证的 Wikipedia文章描述了事务图,但没有太多细节:
服务器向客户端请求证书,以便可以使用 CertificateRequest 消息对连接进行相互验证。
我想知道是否有人可以帮助我调试我遇到的这个问题。我正在尝试使用 PJSIP 堆栈在我的 FreePBX 服务器和 Twilio 之间进行安全中继设置。
未加密的中继在 UDP 上运行良好。但是,当我尝试启用 TLS/SRTP 时,我似乎无法让它工作。一旦我将主干更新为使用 5061 和 TLS 传输,我就会在 Asterisk 日志中得到以下信息。
WARNING[5268] pjproject: tsx0x27c4cd8 .Failed to send Request msg OPTIONS/cseq=28056 (tdta0x26d3af0)! err=171064 (Unsuitable transport selected (PJSIP_ETPNOTSUITABLE))
ERROR[5268] res_pjsip.c: Error 171064 'Unsuitable transport selected (PJSIP_ETPNOTSUITABLE)' sending OPTIONS request to endpoint Twilio
我认为问题可能是 PJSIP 不支持通配符 SSL 证书,而 Twilio 使用的是通配符,但我不确定如何确定。关于如何调试它的任何想法都会非常有帮助。
更新:我直接在星号配置文件中调整了一些 URI,现在我已经克服了不合适的传输错误。新的错误正如我所担心的那样:
ERROR[524] pjproject: RFC 5922 (section 7.2) does not allow TLS wildcard certificates. Advise your SIP provider, please!
关于如何解决这个问题的任何想法?
我已经设置了一个CentOS 7 openLDAP passthrough 身份验证服务器。
它将通过 LDAP 在 Microsoft Active Directory 上托管的数据库上对用户进行身份验证。
如果我使用 LDAP://,我可以获得成功的查询响应
但是,LDAPS:// 会给出证书握手错误。
我正在使用从 GoDaddy 购买的 PFX 格式的证书。
我找到了一些可能的解决方案,但到目前为止没有任何效果。
我努力了:
使用此处解释的 certutil 来制作 MozNSS DB: http ://www.openldap.org/faq/data/cache/1514.html
pk12util -d /path/to/certdb -i /path/to/file.p12
我找到了这个页面https://stackoverflow.com/questions/13732826/convert-pem-to-crt-and-key 但我不知道使用什么命令来获取 openLDAP 的正确格式证书。
我试过这些:
openssl x509 -outform der -in certificate.pem -out certificate.der
openssl x509 -outform der -in certificate.pem -out certificate.crt
当我运行 ldapsearch 时:
ldapsearch -H ldaps://192.168.1.69 -b "OU=Administration,DC=domain,DC=com" -v -LLL -D "CN=ServiceLDAP,OU=Administration,DC=domain,DC=com" "(samaccountname=someuser)" -w secretpass -d1
这些是我得到的错误:
ldap_url_parse_ext(ldaps://192.168.1.32)
ldap_initialize( ldaps://192.168.1.32:636/??base )
ldap_create
ldap_url_parse_ext(ldaps://192.168.1.32:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP 192.168.1.32:636
ldap_new_socket: 4
ldap_prepare_socket: 4
ldap_connect_to_host: Trying 192.168.1.32:636
ldap_pvt_connect: fd: 4 tm: -1 async: 0
attempting to connect:
connect success
TLS: certdb config: configDir='/etc/openldap/certs' tokenDescription='ldap(0)' certPrefix='' keyPrefix='' flags=readOnly
TLS: using moznss security dir /etc/openldap/certs prefix .
TLS: error: tlsm_PR_Recv returned 0 - error 21:Is a directory
TLS: error: connect - force handshake failure: errno 21 - moznss error -5938
TLS: can't connect: TLS error -5938:Encountered end of file.
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
我正在尝试通过 tls 将日志从 rsyslog 转发到 graylog。
# make gtls driver the default
$DefaultNetstreamDriver gtls
#
# # certificate files
$DefaultNetstreamDriverCAFile /etc/ssl/rsyslog/ca.pem
$DefaultNetstreamDriverCertFile /etc/ssl/rsyslog/rsyslog-cert.pem
$DefaultNetstreamDriverKeyFile /etc/ssl/rsyslog/rsyslog-key.pem
#
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer graylog.mydomain.com
$ActionSendStreamDriverMode 1 # run driver in TLS-only mode
*.* @@graylog.mydomain.com:6514 # forward everything to remote server
我生成了 rsyslog 文档中描述的必要证书:
certtool --pkcs8 --generate-privkey --outfile ca-key.pem
certtool --pkcs8 --generate-self-signed --load-privkey ca-key.pem --outfile ca.pem
certtool --pkcs8 --generate-privkey --outfile graylog.key.pem
certtool --pkcs8 --generate-request --load-privkey graylog.key.pem --outfile graylog.request.pem
certtool --pkcs8 --generate-certificate --load-request graylog.request.pem --outfile graylog.cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
certtool --pkcs8 --generate-privkey --outfile rsyslog.key.pem
certtool --pkcs8 --generate-request --load-privkey rsyslog.key.pem --outfile rsyslog.request.pem
certtool --pkcs8 --generate-certificate --load-request rsyslog.request.pem --outfile rsyslog.cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
所有证书文件都在 /etc/ssl/graylog/input-ca/
graylog 输入配置如下:
TLS cert file: /etc/ssl/graylog/input-ca/graylog-cert.pem
TLS private key file: /etc/ssl/graylog/input-ca/graylog-key.pem
TLS Client Auth Trusted Certs: /etc/ssl/graylog/input-ca
但是当 rsyslog 将日志消息推送到 garylog 时,我收到此错误:
2016-10-06T13:19:27.734+02:00 WARN [AbstractNioSelector] Failed to initialize an accepted socket.
java.security.cert.CertificateParsingException: signed fields invalid
at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1791) ~[?:1.8.0_91]
at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:195) ~[?:1.8.0_91]
at sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.java:469) ~[?:1.8.0_91]
at sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:354) ~[?:1.8.0_91]
at java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:462) ~[?:1.8.0_91]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.loadCertificates(KeyUtil.java:90) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.loadCertificates(KeyUtil.java:100) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.initTrustStore(KeyUtil.java:73) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.createSslEngine(AbstractTcpTransport.java:199) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.call(AbstractTcpTransport.java:186) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.call(AbstractTcpTransport.java:182) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.NettyTransport$1.getPipeline(NettyTransport.java:110) ~[graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.registerAcceptedChannel(NioServerBoss.java:134) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.process(NioServerBoss.java:104) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42) [graylog.jar:?]
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [graylog.jar:?]
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [graylog.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_91]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
任何想法可能是什么问题?
我在 Debian 上有一个具有多个域的 nginx 服务器。它们都存在于 html 文件夹中。然后 A 记录指向我的服务器,您可以/var/www/html/mywebsite.biz
通过转到https://mywebsite.biz来访问其中的文件。我还使用 Let's Encrypt 为他们分配了 TLS 证书。
它看起来像这样:
└── html
├── mywebsite.biz
├── anotherwebsite.net
├── example-three.com
└── somewebsite.ca
但是,您可以html
通过我的 ip 地址访问没有 TLS 的文件夹,如下所示:
http://216.58.216.78/mywebsite.biz
但我也有一些我希望这种情况发生的情况。例如,如果我想在将域指向我的服务器之前建立一个测试站点。为此,我使用 noip.com 为其分配了一个友好的名称,如下所示:
http://myservername.ddns.net/somewebsite.ca(只是一个测试站点)
仅通过某些站点的 ip 地址/友好名称拒绝访问的最佳方法是什么?
拒绝/重定向这些:
http://myservername.ddns.net/mywebsite.biz
http://216.58.216.78/mywebsite.biz
允许这样做:
http://myservername.ddns.net/somewebsite.ca
我的猜测是将它们重定向到那里,但我对 nginx 有点陌生,想确保这是最好的方法。
假设我有这些记录:
MTA 连接mail.somedomain
以传递邮件somedomain
并获得证书以供mail.mailserverdomain
提交,MTA 将其主机名显示mail.mailserverdomain
为HELO
.
这是一个有效的 TLS 会话还是意味着一个错误主机名的证书(期望somedomain
或reverse.somedomain
)?
我最近从 dns-01 切换到 http-01 callenge 类型的letsencrypt,因为我计划将来签署我的dns区域,因此不再需要自动区域操作。自从我做出此更改后,我无法再更新我的一些区域(我假设这些区域是我最初通过 dns-challenge 签署的区域)。我的旧区域(从第一次使用开始 - 从一开始就使用 http)工作正常。
只是为了澄清问题,我正在使用lukas2511 的脱水客户端。我添加了一些调试输出来检查该脚本中是否存在问题 - 似乎没有。
请求挑战后,我收到回复:
{
"identifier":{
"type":"dns",
"value":"dennisschuerholz.de"
},
"status":"valid",
"expires":"2017-04-16T11:43:43Z",
"challenges":[
{
"type":"http-01",
"status":"pending",
"uri":"https://acme-v01.api.letsencrypt.org/acme/challenge/<some foo>/133324572",
"token":"<some token>"
},
{
"type":"tls-sni-01",
"status":"pending",
"uri":"https://acme-v01.api.letsencrypt.org/acme/challenge/<some foo>/133324573",
"token":"<some token>"
},
{
"type":"dns-01",
"status":"valid",
"uri":"https://acme-v01.api.letsencrypt.org/acme/challenge/<some foo>/133324574",
"token":"<some token>",
"keyAuthorization":"<some bar>",
"validationRecord":[
{
"Authorities":[
"dennisschuerholz.de.\t900\tIN\tNS\tns3.schuerholz.it.",
"dennisschuerholz.de.\t900\tIN\tNS\tns1.schuerholz.it.",
"dennisschuerholz.de.\t900\tIN\tNS\tns2.schuerholz.it.",
"dennisschuerholz.de.\t900\tIN\tNS\tns.schuerholz.it."
],
"hostname":"dennisschuerholz.de",
"port":"",
"addressesResolved":null,
"addressUsed":""
}
]
}
],
"combinations":[[0],[2],[1]]
}
我真的不明白为什么 dns 挑战类型仍然包含有关域的(过时的)信息,以及“过期”键是否与此有关。
如果我现在尝试回应挑战,状态将永远保持在等待状态。
{
"type":"http-01",
"status":"pending",
"uri":"https://acme-v01.api.letsencrypt.org/acme/challenge/<some foo>/133324572",
"token":"<some token>"
}
似乎我坚持使用 dns 挑战类型,并且想知道为什么以及如何恢复它(如果可能的话)。我只是在暂存路径 ( https://acme-staging.api.letsencrypt.org/directory
) 上使用了相同的脚本和域,效果很好。
我们必须使用 HTTPS 将我们的应用程序(用 Java 8 编写)连接到一些非常旧的服务器。作为 Java 8,我们的客户端支持 TLSv1.2、TLSv1.1、TLSv1 和 SSLv3。当然,它更喜欢使用 TLSv1.2,因为它是最新的协议。
但是,服务器 (Oracle-HTTP-Server 11.1.1.7) 仅支持 TLSv1 和 SSLx。此外,它支持的密码套件选择非常有限,但仍有一个共同的套件可以与 TLSv1 一起使用:SSL_RSA_WITH_3DES_EDE_CBC_SHA(又名 TLS_RSA_WITH_3DES_EDE_CBC_SHA)。
但是,直接连接会因服务器终止握手而失败。我们得到的调试输出(在客户端)如下所示:
main, WRITE: TLSv1.2 Handshake, length = 265
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1.2 ALERT: fatal, close_notify
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: close_notify
对我来说,看起来服务器甚至没有尝试回退到 TLSv1:一旦客户端声明 TLSv1.2 为首选,服务器就会退出。
相比之下,当我们在客户端中明确禁用 TLSv1.2 和 TLSv1.1,从而使 TLSv1 成为首选选项时,握手成功。
我们还尝试连接到另一个不知道 TLSv1.2 和 TLSv1.1 的旧服务器,但这里的连接按预期工作:即使客户端说它更喜欢 TLSv1.2,他们同意服务器使用 TLSv1,作为最佳通用协议:
main, WRITE: TLSv1.2 Handshake, length = 269
main, READ: TLSv1 Handshake, length = 85
...
问题:服务器是否有责任从客户端支持的 TLS/SSL 协议列表中进行选择?我可以对服务器维护人员说行为不端的是服务器,而不是我们的客户端吗?
我使用 certbot 为我的域创建了一个让我们加密证书。我确保包含 www 和一些(需要的)子域,因此证书应该对非 www 和 www 有效:
domain.com www.domain.com sub1.domain.com ...
但事实并非如此,如果我尝试访问https://domain.com会引发 ssl 错误。
在证书查看器中(通过 www 访问时)我可以看到 Common Name (CA) domain.com。证书主题替代名称包含非 www 和 www...
所以我不明白为什么它会给出这个错误:
domain.com uses an invalid security certificate.
The certificate is not trusted because it is self-signed.
Error code: SEC_ERROR_UNKNOWN_ISSUER
我确实生成了一个自签名证书,但是对于默认的虚拟主机块(httpd-ssl.conf 中的那个),其他块正在使用让我们加密证书。
我还确保删除了 Firefox 缓存。
我确实添加了一个异常,现在每次我写https://domain.com时它都会重定向到https://www.domain.com。
我使用的是 Apache 2.4.23,我的虚拟主机配置如下:
<VirtualHosts *:80>
Servername domain.com
Redirect permanent / https://www.domain.com/
</VirtualHosts>
<VirtualHost *:443>
ServerName domain.com:443
Redirect permanent / https://www.domain.com:443/
</VirtualHost>
<VirtualHost *:PORT> # 80 and 443
ServerAdmin [email protected]
DocumentRoot "/srv/http/domain.com/www"
ServerName www.domain.com:443
Protocols h2 h2c
<Directory "/srv/http/domain.com/www">
Require all granted
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>
</Directory>
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/domain.com/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/domain.com/privkey.pem"
Header always set Strict-Transport-Security "max-age=15768000"
ErrorLog "/var/log/httpd/domain.com-ssl_error_log"
CustomLog "/var/log/httpd/domain.com-ssl_access_log" common
LogLevel debug
</VirtualHost>