2017-06-20 79 views
2

有人知道如何编码/解码X509AttributeCertificateHolderX509AttributeCertificateHolder编码和解码

我尝试下面的代码(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 - 验证:N/A]

这是用base64结构:

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

您能否在base64中提供属性证书? – 2017-06-20 11:51:19

+0

你可以[编辑]你的问题,并添加base64到它?因为我无法在所提供的信息中重现相同的情况。 – 2017-06-20 16:16:32

+0

我可以将MySQL中的属性证书保存为base64格式。以下是属性证书编码和解码的代码片段。 '''的java myDatabase.inserting(acSerial,pkcSerial,Base64.getUrlEncoder()encodeToString(att.getEncoded())。); //转换为AC对象 byte [] data = Base64.getDecoder()。解码(b_encoded); certificateHolder = new X509AttributeCertificateHolder(data); ''' – Hakikat41

回答

2

要检查这是怎么回事,我用你的代码,并做了以下内容:

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
class 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

+2

很好的答案!我认为这是一个在bouncycastle中的错误,因为当编码/解码期望与之前相同的对象值时 –

+0

非常感谢Hugo为你的答案。 – Hakikat41

+0

不客气,很高兴为您提供帮助。如果你发现这个答案有用,它解决了你的问题,你可以upvote和/或接受它:https://stackoverflow.com/help/someone-answers – 2017-06-20 18:53:33