安装不再在 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 的自签名证书并使其被浏览器接受