- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在将 Base64 编码的 DER 证书传递给 Java 应用程序以从中提取公钥时遇到问题。我可以在 Objective-C 和 ruby 中完成这项工作,但在 Java 中遇到错误。
我在 Ruby 中创建了以下 DER base64 key (简化版):
key = OpenSSL::PKey::RSA.new(2048)
public_key = key.public_key
subject = "/C=BE/O=Test/OU=Test/CN=Test"
cert = OpenSSL::X509::Certificate.new
cert.subject = cert.issuer = OpenSSL::X509::Name.parse(subject)
cert.not_before = Time.now
cert.not_after = Time.now + 365 * 24 * 60 * 60
cert.public_key = public_key
cert.serial = 0x0
cert.version = 2
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = cert
ef.issuer_certificate = cert
cert.extensions = [
ef.create_extension("basicConstraints","CA:TRUE", true),
ef.create_extension("subjectKeyIdentifier", "hash"),
# ef.create_extension("keyUsage", "cRLSign,keyCertSign", true),
]
cert.add_extension ef.create_extension("authorityKeyIdentifier",
"keyid:always,issuer:always")
cert.sign key, OpenSSL::Digest::SHA1.new
der => Base64.encode64(cert.to_der)
这是一个示例输出:
MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQGEwJC\nRTENMAsGA1UECgwEVGVzdDENMAsGA1UECwwEVGVzdDENMAsGA1UEAwwEVGVz\ndDAeFw0xNTA1MjExNDUxNTZaFw0xNjA1Mj AxNDUxNTZaMDoxCzAJBgNVBAYT\nAkJFMQ0wCwYDVQQKDARUZXN0MQ0wCwYDVQQLDARUZXN0MQ0wCwYDVQQDDARU\nZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvbC3phpnj/Vg\neIAmWXD3T kGI91kPFBvrrD/LLa4kv83eOuY139vUn/xjZlM9maE36Yix6Ix1\ncF3cGCUl1VZApJYTef404jL13xLg1i9+96/tU91niZMlRkFL0mZWV2XhEzNH\nA+lRiJZlGdXNwYUKXb9qVRu S2taSAyMwH/SDPu1s17SGVLY1o+7trAQfK7w\ny5w8fyTr+tCdcplb5F/m6R5FXc4eJwD6m9MYnenlmkoW5uM5B1lbQBVz2by3\nVGCMUmLwpC15pi13/fIJ8WzD1SQcYJgIQTauWVRYxSuc+ Cg0VvoyMZNqkqOW\n7iKmZXGqwNQKxhLtcc1KNJky7OHLkQIDAQABo4GXMIGUMA8GA1UdEweb/wQF\nMAMBAf8wHQYDVR0OBBYEFNWHBjgj9rsOBm6Z9+me3I/E1ZrUMGIGA1UdIwRb\nMFmAFNWHBjgj9 rsOBm6Z9+me3I/E1ZrUoT6kPDA6MQswCQYDVQQGEwJCRTEN\nMAsGA1UECgwEVGVzdDENMAsGA1UECwwEVGVzdDENMAsGA1UEAwwEVGVzdIIB\nADANBgkqhkiG9w0BAQUFAAOCAQEAbKYmQxaQaGT57Qq8xYzIzODG qjbek3qC\n8kSjUto9H/5o8OCKqDFJfgaYAS9mgEjjazqmMahoDeLvzRkKHkpXLvdjjjv7\nnnMZGIw7I4yOKvtzGDz2eimonlWPePypTwr0NFnnUByQb9nkrOorpcSKBn7a\nwvIT7b82ISOoMz1+hlyo8dy iZri82J6pKXTP91LcfpSRiC/1W1sXnIL5DSJi\nDtXGMVtDfy9rRgPJhmOPu4xqInl/o+t2A1OXLhA4aDnxP/gbssVau9Do3uIa\nOlyo9eGpatIvkxCMzC4SgBavBy6Gsk2p4KAuWon9TtD zO5vklEI8QKk1tiyJ\nYZBCeK3HwQ==\n
如果我要在 Ruby 中从中获取公钥,我会这样做:
der = Base64.decode64(data["certs"]["device_key"])
x509_cert = OpenSSL::X509::Certificate.new der
public_rsa_2048_key = x509_cert.public_key
Java 中的相同内容有点冗长,但是(归功于 SO)这就是我所拥有的:
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.io.File;
import java.security.cert.CertificateFactory;
import java.io.ByteArrayInputStream;
import java.security.cert.Certificate;
import java.security.PublicKey;
import java.io.FileInputStream;
import java.nio.charset.Charset;
import java.nio.channels.FileChannel;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.DatatypeConverter;
import java.nio.channels.Channels;
import java.io.Console;
public class EncryptionTest{
public static void main(String[] args) throws IOException, GeneralSecurityException {
Console console = System.console();
console.writer().println("Loading base64 key from file");
// get a handle on the base64 encoded key and certificate
// File privateKeyFile = new File("private.der.b64");
File publicKeyFile = new File("public.der.b64");
console.writer().println("Converting to byteArray");
// pull them into arrays
// byte[] privateKeyBytes = toByteArray(privateKeyFile);
byte[] publicKeyBytes = toByteArray(publicKeyFile);
console.writer().println("decoding base64 bytes");
// decode them
// privateKeyBytes = toDecodedBase64ByteArray(privateKeyBytes);
publicKeyBytes = toDecodedBase64ByteArray(publicKeyBytes);
// get the private key
// KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// KeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
// PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
console.writer().println("Building Cert");
// get the public key
CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
Certificate certificate = certificateFactory.generateCertificate(new ByteArrayInputStream(publicKeyBytes));
console.writer().println("Extracting Public Key");
PublicKey publicKey = certificate.getPublicKey();
console.writer().println("Key:" + publicKey.toString());
}
private static byte[] toByteArray(File file) throws IOException {
// java 7's try-with-resources statement
try (FileInputStream in = new FileInputStream(file);
FileChannel channel = in.getChannel()) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
channel.transferTo(0, channel.size(), Channels.newChannel(out));
return out.toByteArray();
}
}
private static byte[] toDecodedBase64ByteArray(byte[] base64EncodedByteArray) {
return DatatypeConverter.parseBase64Binary(
new String(base64EncodedByteArray, Charset.forName("UTF-8")));
}
}
但是,当我运行此命令时,出现以下错误:
Exception in thread "main" java.security.cert.CertificateException: Unable to initialize, java.io.IOException: DerInputStream.getLength(): lengthTag=105, too big.
at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:199)
at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:98)
at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
at EncryptionTest.main(EncryptionTest.java:50)
Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=105, too big.
at sun.security.util.DerInputStream.getLength(DerInputStream.java:561)
at sun.security.util.DerValue.<init>(DerValue.java:252)
at sun.security.util.DerInputStream.getDerValue(DerInputStream.java:417)
at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1761)
at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:196)
任何关于如何在 Java 中解决这个问题的指示都会很棒!谢谢
最佳答案
您需要将示例输出中的 \n
替换为 换行符
。那么你的代码就不会失败。
输出(长行被截断)
Loading base64 key from file
Converting to byteArray
decoding base64 bytes
Building Cert
Extracting Public Key
Key:Sun RSA public key, 2048 bits
modulus: 239461822256650353755672 ...
public exponent: 65537
编辑 替换 \n
的一种可能的解决方案可能是将其替换为两个换行符(只是因为不更改数组中的字节数) )。
修改您的方法toByteArray
,如下所示。
private static byte[] toByteArray(File file) throws IOException {
byte[] allBytes = Files.readAllBytes(file.toPath());
for (int i = 0; i < allBytes.length; i++) {
if (allBytes[i] == '\\') {
allBytes[i++] = 10;
allBytes[i++] = 10;
}
}
return allBytes;
}
关于java - 从 Base64 DER 构建公钥 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31132981/
起初,这是我的第一篇文章——如果这篇文章没有得到很好的描述和设计,我很抱歉。 我的问题是我需要使用 Spring Boot 通过 SSL 连接连接到 GCP 中的数据库。在 GCP 内部生成三个所需的
是否可以创建相同大小的 openssl 证书(server.key.der 或 server.crt.der).. 1024 或 2048 或任何固定大小?我喜欢这一点,每次我创建证书时它都会更改大小
我有一个 DER 格式的证书文件和一个 DER 格式的 key 文件, key 是加密的。 我想创建一个包含 PEM 格式的证书和加密 key 的 cer 文件,例如: -----BEGIN CERT
我正在尝试将 certifictae 和 key 写入 stm32 的闪存 EEPROM,我知道我们可以写入字符串,但是否有可能在闪存中写入整个证书(.der)。我正在使用 stm32f7 微 Con
我正在尝试将 X509 证书写入内存中的 DER 格式。将其写入文件非常有效。 我需要 PEM 格式的证书,不带“-----BEGIN PRIVATE KEY-----”页眉、页脚或换行符。我无法弄清
为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。 在 c# 中必须删除前导零,有人知道为什么吗? 在 http://etherhack.co.uk/asym
我有一个 X.509 证书,其中包含一组带有以下隐式 [0] 标记的数据: A0 81 C6 (value)... 我有一个标准文档的摘录: The IMPLICIT [0] tag is not u
如何从代表 DER 格式证书的十六进制字符串中提取通用名称?我需要显示证书的名称,以便客户端可以选择他们希望在 Web 应用程序中使用的证书。 限制: 我需要在网络浏览器中执行此提取客户端操作。 Op
使用 BounceCaSTLe 我可以使用以下代码。它生成一个 key 对并返回 ASN.1 DER 编码格式。 //Generate new key var generator = new RsaK
我最初有一个受密码保护的 PEM 文件,其中包含使用 BouncyCaSTLe 读入 Java 应用程序的私钥。 PEM 文件开头为 -----开始 RSA 私钥----- 这让我相信它是 PKCS#
在十六进制编辑器中是否存在某种 DER 数字签名? 我得到了一个二进制内容大约为 1.3 KB 的 .cer 文件。有人告诉我它是 DER 格式,我的阅读表明具有此扩展名的证书几乎都是 DER 或带有
我有一个应用程序需要安装证书,它使用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:CERTIFICATE_URL]]
我正在尝试验证文件的签名。我按照这些说明生成证书: // generate a private key with size of 2048 bits openssl genrsa -out priva
我想创建一个能够对大整数(即 ECDSA signature r and s)进行 DER 编码和解码的 Google Go 应用程序。据我了解,我应该使用 asn1 package , 但我应该调用
我正在尝试为 Elasticsearch Searchguard 创建证书.一项要求是证书必须在 SAN 中包含 oid:1.2.3.4.5.5。我正在使用 GO 生成该证书。经过一些尝试和错误后,我
我需要从我的示例 ASN1 编译并生成一个 .DER 文件 BCAS DEFINITIONS ::= BEGIN BBCard ::= SEQUENCE { name IA5String (SIZ
我有一个 X509Certificate,我将它写入/打印到一个文件中,如下所示。 (我不是在写编码字节,因为我想阅读证书的内容) X509Certificate cer = generateCert
我正在尝试对安全网站进行 POST 调用: 步骤: 1) 转到https://www.mywebsite.com (供引用) 2) 将上述网站的 keystore 导出到C:\Program File
这是我的结构: SET OF SEQUENCE: INTEGER: XX INTEGER: YY 我的编码是这样的: 11 08 10 06 02 01 XX 02 01 Y
我见过很多问题,但没有一个真正提供好的答案,或者即使他们尝试了,他们也会假设提出问题的人并没有问他实际上在问什么。郑重声明,我不是在询问签名、加密或 PEM 文件! 就我而言,我将收到一个加密数据的小
我是一名优秀的程序员,十分优秀!