我目前正在使用自行创建的自签名证书
开发环境。 ... javax.net.ssl.SSLHandshakeException:
java.security.cert.CertificateException:没有名称匹配
找到 dev.ppc.lftechnology.com
自签名证书似乎不正确。
下面是OpenSSLCONF
我用来创建在测试期间使用的自签名证书和证书请求的文件。另存为example-com.conf
。更改下面的 DNS 名称[ alternate_names ]
以满足您的口味。你甚至可以把localhost
, localhost.localdomain
and 127.0.0.1
在那里进行测试。
如果您想创建自签名证书,请使用:
openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
如果您想创建由受信任的机构签名的签名请求 (CSR),请使用:
openssl req -config example-com.conf -new -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
自签名证书和签名请求之间的区别在于-x509
选项。和-x509
现在,自签名证书已创建。的缺席-x509
表示创建了一个请求。
如果您想打印自签名证书或请求查看其中的实际内容,请使用:
openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout
如果你想测试服务器,那么使用s_client
:
openssl s_client -connect <server>:<port> -CAfile <trust-anchor.pem>
上述命令应以类似以下内容的消息结束Verify OK (0)
。如果您没有收到Verify OK (0)
,然后修复您的测试设备。一旦 OpenSSL 成功完成,那么这将成为您的基线。
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_extensions
x509_extensions = cert_extensions
string_mask = utf8only
[ 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. Its presented to the user.
# The server's DNS name show up in Subject Alternate Names. Plus,
# DNS names here is deprecated by both IETF and CA/Browser Forums.
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = [email protected]
[ cert_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
# extendedKeyUsage = serverAuth
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
# extendedKeyUsage = serverAuth
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ 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
可以跳过 SSL 验证吗?
不,这是非常不负责任的。如果您不打算正确使用 PKIX,那为什么还要使用它呢?
我想到了这一点:世界上最危险的代码:在非浏览器软件中验证 SSL 证书.
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
最好将您的自签名证书加载到密钥库中(或加载您的私有 CA),然后将其传递给SSLContext.init
。然后一切都会按预期进行,无需信任一切或返回true
from verify
.
Bruno 和 EJP 对于这个主题有很多答案。
为开发和生产环境实现通用解决方案的其他替代方法是什么?
使用格式良好的证书来链接回受信任的根。
为了进行测试,您可以创建自签名证书。或者,创建一个证书请求并由您的内部 CA 在私有 PKI 中对其进行签名。在这种情况下,您需要信任您的自签名证书或信任您的内部 CA。
对于生产,您可以使用由 CA Zoo 成员之一签名的证书,以便组织外部的其他人也信任它。StartCom and CACert提供免费的 1 级证书。
1 类证书通常经过域验证,并且不允许使用通配符。虽然 Class 1 是免费发行的,但他们会对撤销收取费用,因为这就是成本所在。
如果您需要外卡,那么您通常会购买 2 级或更高级别的卡。