2017-06-20 121 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