【问题标题】:X509AttributeCertificateHolder encode and decodeX509AttributeCertificateHolder 编码和解码
【发布时间】:2017-06-20 08:56:52
【问题描述】:

有人知道如何对X509AttributeCertificateHolder 进行编码/解码吗?

我尝试了以下代码(att 是创建的X509AttributeCertificateHolder):

byte[] arr = att.getEncoded();
X509AttributeCertificateHolder holder = new X509AttributeCertificateHolder(arr);

问题是:holderatt 的属性不一样。

我使用了以下简单的测试:

for (int i = 0; i < holder.getAttributes().length; i++) {
    Attribute attr1 = holder.getAttributes()[i];
    Attribute attr2 = att.getAttributes()[i];

    System.out.println("Holder value after decode: " + attr1.getAttrValues());
    System.out.println("Holder value before encode: " + attr2.getAttrValues());
}

而测试的结果是:

解码后的持有者值: [[[1][6]#69643a2f2f444155313233343536373839]]

编码前的持有人值:[名称:id://DAU123456789 - Auth:N/A]

这就是base64中的结构:

MIIBvzCCASgCAQEwZ6BlMGCkXjBcMQswCQYDVQQGEwJBVTEoMCYGA1UECgwfVGhl
IExlZ2lvbiBvZiB0aGUgQm91bmN5IENhc3RsZTEjMCEGA1UECwwaQm91bmN5IFBy
aW1hcnkgQ2VydGlmaWNhdGUCAQKgYjBgpF4wXDELMAkGA1UEBhMCQVUxKDAmBgNV
BAoMH1RoZSBMZWdpb24gb2YgdGhlIEJvdW5jeSBDYXN0bGUxIzAhBgNVBAsMGkJv
dW5jeSBQcmltYXJ5IENlcnRpZmljYXRlMA0GCSqGSIb3DQEBBQUAAgEBMCIYDzIw
MTcwNjIwMTQ1MDIyWhgPMjAxNzA2MjAxNDUyMDJaMCAwHgYDVQRIMRcwFaEThhFp
ZDovL0RBVTEyMzQ1Njc4OTANBgkqhkiG9w0BAQUFAAOBgQBJ3qTRoIugVaP0KSyd
jcMV3crYjuVGapxe6TTJtDqHc8xXreGhoqvSZv/r6hc6D0Fkjc45fZN4iDml3aLy
E7EsGsRFEm+6cLP4/8s8kgkbPk8ZjslxuQz+IScTXHQABv/5gVzjCC+4cTZ/BccM
KtbQwhNz+aIiJM60uVcW+hfC0w==

【问题讨论】:

  • 能否提供base64的属性证书?
  • 你能edit你的问题并添加base64吗?因为我无法使用提供的信息在这里重现相同的情况。
  • 我可以将MySQL中的属性证书保存为base64格式。这是属性证书的编码和解码的代码sn-p。 java myDatabase.inserting(acSerial,pkcSerial,Base64.getUrlEncoder().encodeToString(att.getEncoded())); // Convert to AC object byte[] data = Base64.getDecoder().decode(b_encoded); certificateHolder = new X509AttributeCertificateHolder(data);
  • edit您的问题并将代码(和所有相关信息)添加到其中。这比在 cmets 中发布要好得多。

标签: java decode encode bouncycastle attributecertificate


【解决方案1】:

为了检查发生了什么,我使用了您的代码并执行了以下操作:

Attribute attr1 = holder.getAttributes()[i];
Attribute attr2 = att.getAttributes()[i];

ASN1Set values1 = attr1.getAttrValues();
System.out.println(values1.getObjectAt(0).getClass());
ASN1Set values2 = attr2.getAttrValues();
System.out.println(values2.getObjectAt(0).getClass());

输出是:

类 org.bouncycastle.asn1.DLSequence
类 org.bouncycastle.asn1.x509.RoleSyntax

因此,在编码之前(在att 变量中),属性值为RoleSyntax。如果你看一下它的toString() 方法,它会以Name: [value] - Auth: [value] 的格式打印值。

但是在编码之后(在holder变量中),由于某种原因,BouncyCastle 丢失了这个信息,属性值变成了一个DLSequence

要解决这个问题,你需要使用这个序列来创建一个RoleSyntax 对象:

Attribute attr1 = holder.getAttributes()[i];

ASN1Set values1 = attr1.getAttrValues();

RoleSyntax rl = RoleSyntax.getInstance(attr1.getAttrValues().getObjectAt(0));
System.out.println(rl);

输出将是:

名称:id://DAU123456789 - 身份验证:N/A

【讨论】:

  • 很好的答案!我认为这是 bouncycastle 中的一个错误,因为在编码/解码时我期望与以前相同的对象值
  • 非常感谢 Hugo 的回答。
  • 不客气,乐于助人。如果您发现此答案有用并且解决了您的问题,您可以投票和/或接受它:stackoverflow.com/help/someone-answers
  • 可以添加RoleSyntax对象,尤其是holder对象的属性吗?原因是我想用正确的打印属性保存持有者对象?
  • 也许,如果你手动重建整个结构,或者重写 bouncycastle 的代码(但不确定是否值得)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多