我正在开发一个Android项目.我有一个PEM证书字符串:
-----BEGIN CERTIFICATE-----
MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix
EzARBgNVBAgTClNvbWUtU3RhdGUxFDASBgNVBAoTC0..0EgTHRkMTcwNQYD
VQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcn..XRpb24gQXV0aG9y
...MANY LINES...
It8una2gY4l2O//on88r5IWJlm1L0oA8e4fR2yrBHX..adsGeFKkyNrwGi/
7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
(我将上面的证书字符串分配给一个名为的变量CERT_STR)
我将以上PEM字符串转换为X509Certificate:
byte[] certBytes = CERT_STR.getBytes();
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
InputStream certIs = new ByteArrayInputStream(certBytes);
// now I get the X509 certificate from the PEM string
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(certIs);
Run Code Online (Sandbox Code Playgroud)
然后,我尝试通过以下方式以编程方式安装证书:
Intent intent = KeyChain.createInstallIntent();
// because my PEM only contains a certificate, no private key, so I use EXTRA_CERTIFICATE
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, certificate.getEncoded());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序,我看到系统弹出对话框说"提取...",我知道系统提取我的证书,但对话框显示有所有的时间说"解压...".
为什么?我的代码安装证书在哪里错了?
根据例如http://luca.ntop.org/Teaching/Appunti/asn1.html,序列具有十六进制的标签号10.但是为什么DER编码为30而不是10?标记号为十六进制的INTEGER也编码为02.谢谢.
例如Sample :: = SEQUENCE {number 5}
编码为30 03 02 01 05
我试图了解隐式和显式标签实际上是如何以 DER 二进制形式编码的。
基本的例子很清楚。普通整数,
x INTEGER ::= 5
Run Code Online (Sandbox Code Playgroud)
被编码为 TLV 三元组02 01 05。在
x [2] IMPLICIT INTEGER ::= 5
Run Code Online (Sandbox Code Playgroud)
隐式标记82替换现有标记02并形成另一个 TLV:82 01 05,并且在
x [3] EXPLICIT INTEGER ::= 5
Run Code Online (Sandbox Code Playgroud)
在原始 TLV 周围添加了一个包装器:A3 03 02 01 05。
现在我正在研究一个更复杂的案例
30 42 A1 40 30 0D 82 0B 77 77 77 2E 62 61 64 2E
6F 72 67 30 09 82 07 62 61 64 2E 63 6F 6D 30 0D
81 …Run Code Online (Sandbox Code Playgroud) DER中是否存在某种数字签名,这在十六进制编辑器中是显而易见的?
我已经获得了一个包含大约1.3 KB二进制内容的.cer文件.有人告诉我,这是DER格式,以及我的阅读建议,这个扩展的证书与人类可读的头几乎所有以DER或基地64编码DER,并且此文件不具有这样的标题.但是,我无法打开它来创建密钥.在我花费大量时间对此文件进行故障排除之前,我想确定它确实是DER格式.
我想从.pemJava中的字符串(文件)生成私钥.
private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
try {
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
}
catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
最后一行(generatePrivate函数)抛出此异常:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 我创建了我认为是包含公钥DER文件的证书,但我现在需要PEM格式的公钥用于不同的平台.目的是使用相同的公钥.
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
Run Code Online (Sandbox Code Playgroud)
我有一个正在使用的公钥(public_key.der),无法更改它.但是我现在需要PEM版本的公钥
public_key.pem
Run Code Online (Sandbox Code Playgroud)
如何以这种方式从DER转换为PEM?
注意:如果我使用以下方法创建了我的密钥对,那么事情会很简单.我可以提取公钥PEM文件:
openssl genrsa -out rsa.pem 1024
openssl rsa -in rsa.pem -pubout
Run Code Online (Sandbox Code Playgroud)
以这种方式生成的公共PEM文件有效.是否有可能我创建的预告片(使用-x590命令)与命令输出完全不同的生物rsa?
我一直在阅读
特别是,§8.5.6.4(d),关于具有可变长度尾数和指数的REAL值的二进制编码,如下所示:
"如果第2位到第1位是11,则第二个内容八位字节编码八位字节的数量,X表示,(作为无符号二进制数)用于编码指数的值,第三个直到(X加3)th(包含)内容八位字节将指数的值编码为二进制补码二进制数 ; X的值至少为1 ;发送指数的前九位不应全为零或全部为1.
这是不一致的,因为从"第三个到(X加3)[rd] "的八位字节实际上是X + 1个八位字节.
有人能澄清这一节吗?
我认为它应该读
"......然后,第二个内容八位字节编码比八位字节数少一个,X说,......"
要么
"......第三个到(X加2)和nd(含)内容八位字节......"
并且,X的最小值是1,还是0 表示 1个八位字节?
附录:如果有人可以向我提供一些不同BER编码值(八位字符串及其含义)的测试数据,那将会很有帮助.
到目前为止我所拥有的是什么
众所周知,公钥由公共指数和模数组成.
我的问题是:
如何从公共指数和RSA模数生成DER/PEM证书?
非常感谢你提前.
我有一个 DER 格式的 base64 编码的公钥。在Python中,如何将其转换为COSE密钥?
这是我失败的尝试:
from base64 import b64decode
from cose.keys import CoseKey
pubkeyder = "...=="
decCborData.key = CoseKey.decode(b64decode(pubkeyder))
Run Code Online (Sandbox Code Playgroud)