安装不再在 Android Q 中工作的自签名证书

Posted

技术标签:

【中文标题】安装不再在 Android Q 中工作的自签名证书【英文标题】:Install self-signed certificates no longer working in Android Q 【发布时间】:2020-02-18 09:42:37 【问题描述】:

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

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

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

【问题讨论】:

嘿,你解决了这个问题吗? 【参考方案1】:

太棒了!这段代码解决了我的问题:

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

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

谢谢!

【讨论】:

如何获取第三方服务器的私钥?为什么android Q有这种功能?来自android的任何解释 我也很好奇。应用程序或操作系统请求私钥是零意义的,它首先违背了使用证书的目的。【参考方案2】:

以@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 配置 sn-p 拒绝所有连接,除了那些提供由上述 ca cert 签名的证书的连接:

# 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 浏览器现在访问该网站时,只有在您出示签名证书的情况下,它才会让您进一步访问。

【讨论】:

你能和我们分享一个例子吗? 当然,我已经扩展了答案。希望对您有所帮助。【参考方案3】:

以下是我从this answer 创建适用于 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

创建证书后:

    将 test.crt(至少在我的情况下不是 ca.crt)安装到您的服务器并重新启动它。 通过电子邮件将 test.crt 发送到您的 Gmail 帐户,然后在您的 Android 设备或模拟器,然后点击安装。 (会出现在 设置/加密和凭据/受信任下的“用户”选项卡 凭据。)

【讨论】:

将您的beerpay.io 链接或您碰巧使用的任何内容发送给我!你,我的朋友,值得一两杯啤酒!这两天我一直在努力,终于在正确的谷歌搜索中找到了这里。 很高兴它有帮助。我很快就会在***.com/q/57565665/1161573 上发布一个更好的答案,这要简单得多 CA:TRUE 约束似乎是大多数人所缺少的,我最初认为(愚蠢的我!)您的答案与我正在做的非常相似并跳过了它,但一个最小的例子有效对我来说,android.stackexchange.com/questions/237141/… 有那个标志。

以上是关于安装不再在 Android Q 中工作的自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

无法在工作资料上的 Android 11 上安装 CA 证书

创建用于测试 localhost 的自签名证书并使其被浏览器接受

在 IBM MobileFirst Platform Android 中绕过自签名证书

Heroku 登录错误:证书链中的自签名证书

Android Volley 自签名证书

在 .Net Core 控制台应用程序中生成受信任的自签名证书