X509AttributeCertificateHolder编码和解码
X509AttributeCertificateHolder encode and decode
有人知道如何 encode/decode X509AttributeCertificateHolder
吗?
我尝试了下面的代码(att
是创建的X509AttributeCertificateHolder
):
byte[] arr = att.getEncoded();
X509AttributeCertificateHolder holder = new X509AttributeCertificateHolder(arr);
问题是:holder
和 att
的属性不一样。
我使用了以下简单测试:
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());
}
测试结果为:
Holder value after decode:
[[[1][6]#69643a2f2f444155313233343536373839]]
Holder value before encode: [Name: 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==
为了检查发生了什么,我使用了您的代码并执行了以下操作:
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());
输出为:
class 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);
输出将是:
Name: id://DAU123456789 - Auth: N/A
有人知道如何 encode/decode X509AttributeCertificateHolder
吗?
我尝试了下面的代码(att
是创建的X509AttributeCertificateHolder
):
byte[] arr = att.getEncoded();
X509AttributeCertificateHolder holder = new X509AttributeCertificateHolder(arr);
问题是:holder
和 att
的属性不一样。
我使用了以下简单测试:
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());
}
测试结果为:
Holder value after decode: [[[1][6]#69643a2f2f444155313233343536373839]]
Holder value before encode: [Name: 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==
为了检查发生了什么,我使用了您的代码并执行了以下操作:
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());
输出为:
class 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);
输出将是:
Name: id://DAU123456789 - Auth: N/A