15

我已经生成了一个自签名证书,我尝试将它安装在运行 Android 10 的手机上,但出现了一个提示Private key required to install certificate

我已经在运行 Android 9 且具有相同证书的手机上进行了尝试,它可以按预期工作。

知道是否有任何解决方法可以安装 CA?

4

3 回答 3

11

伟大的!我的问题用这段代码解决了:

openssl pkcs12 -export -in test.crt -inkey test.key -out test-combined.p12

之后,我设法将 test-combined.p12 证书正常导入我的Android 10

谢谢!

于 2020-05-15T19:29:18.303 回答
7

以下是我从这个答案创建一个可与 Android、iOS 和 Chrome 一起使用的自签名证书的方法:

openssl 命令:

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/C=US/ST=Oklahoma/L=Stillwater/O=My Company/OU=Engineering/CN=test.com" -keyout ca.key -out ca.crt
openssl genrsa -out "test.key" 2048
openssl req -new -key test.key -out test.csr -config openssl.cnf
openssl x509 -req -days 3650 -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extensions v3_req -extfile openssl.cnf -out test.crt
openssl x509 -inform PEM -outform DER -in test.crt -out test.der.crt

openssl.cnf 的内容:

[req]
default_bits = 2048
encrypt_key  = no # Change to encrypt the private key using des3 or similar
default_md   = sha256
prompt       = no
utf8         = yes

# Specify the DN here so we aren't prompted (along with prompt = no above).

distinguished_name = req_distinguished_name

# Extensions for SAN IP and SAN DNS

req_extensions = v3_req

# Be sure to update the subject to match your organization.

[req_distinguished_name]
C  = US
ST = Oklahoma
L  = Stillwater
O  = My Company
OU = Engineering
CN = test.com

# Allow client and server auth. You may want to only allow server auth.
# Link to SAN names.

[v3_req]
basicConstraints     = CA:TRUE
subjectKeyIdentifier = hash
keyUsage             = digitalSignature, keyEncipherment
extendedKeyUsage     = clientAuth, serverAuth
subjectAltName       = @alt_names

# Alternative names are specified as IP.# and DNS.# for IP addresses and
# DNS accordingly.

[alt_names]
DNS.1 = test.com

创建证书后:

  1. 将 test.crt(至少在我的情况下不是 ca.crt)安装到您的服务器并重新启动它。
  2. 通过电子邮件将 test.crt 发送到您的 Gmail 帐户,然后在您的 Android 设备或模拟器中登录 Gmail 并点击安装它。(它将出现在“设置”/“加密和凭据”/“受信任的凭据”下的“用户”选项卡中。)
于 2019-10-27T14:52:17.970 回答
4

基于@ScottyB 的回答:

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/C=US/ST=Oklahoma/L=Stillwater/O=My Company/OU=Engineering/CN=test.com" -keyout ca.key -out ca.crt
openssl genrsa -out "test.key" 2048
openssl req -new -key test.key -out test.csr -config openssl.cnf
openssl x509 -req -days 3650 -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extensions v3_req -extfile openssl.cnf -out test.crt

该错误提示了如何修复。如果您将上面生成的证书和私钥合并到一个文件中,Android 将接受它:

openssl pkcs12 -export -in test.crt -inkey test.key -out test-combined.p12

将 .p12 文件传输到您的 Android 手机,然后使用从设备存储安装。给它一个好听的可读名称,CA 证书现在可以与使用 ca.key 和 ca.crt 的 Web 服务器等服务一起使用。

这是一个 Nginx 配置片段,用于拒绝所有连接,除了那些提供由上述 ca 证书签名的证书的连接:

# within server block, eg. under the ssl_certificate config
    ssl_client_certificate /etc/ssl/ca/ca.crt;
    ssl_trusted_certificate /etc/ssl/ca/ca.crt;
    ssl_verify_client optional_no_ca;
    if ($ssl_client_verify != SUCCESS) { return 403; }

当您的 Android 浏览器现在访问该网站时,只有您出示签名证书,它才会让您进一步进入。

于 2020-02-16T04:56:57.110 回答