我有基本64二进制格式的证书x509。如何使用Oracle检索有关证书的信息?我必须得到这个证书的序列号。有什么想法吗?
答案 0 :(得分:1)
Oracle论坛上有一个解决方案:SQL to extract specific attributes from an x509 digital certificate
代码(原件用于存储为CLOB的证书,我将其修改为BLOB并返回序列号):
FragmentManager fm = getFragmentManager();
uiFragment = (UiFragment) fm.findFragmentByTag("ui");
uiFragment.fetchNewData();
uiFragment.displayNewData();
答案 1 :(得分:0)
在对证书进行base64解码后,您很可能会获得X.509 v3证书的DER编码ASN.1结构(足够的关键字可以继续搜索答案)。
我不知道ASN.1解析器的任何PL / SQL实现,解析DER编码的内容,但是可以学习ASN.1结构(序列,整数等)及其DER格式的二进制表示,然后逐字节地在PL / SQL中进行解析。 =>序列号接近DER-content的开头,因此您无需支持解析每个ASN.1元素以提取序列号。
您可能必须查看X.509 certificate structure/template,解释如何从基本ASN.1元素构造证书,然后解析/提取元素并获取您感兴趣的信息。
证书内容的更详细说明:X.509证书包含一些数据字段,如版本,序列号,有效的自/至日期,颁发者DN(可分辨名称),主题DN,主题公钥,签名哈希算法然后,证书发行者对该信息进行“签名”:发行者根据上述信息创建哈希码(例如,使用SHA-1算法),然后使用发行者的私钥(RSA加密)对其进行加密。拥有发行者的公钥并信任发行者,可以使用发行者的公钥来解密由发行者加密的哈希码,然后使用相同的算法从证书细节创建哈希码,最后将计算的哈希值与发行者的哈希值进行比较。创建。如果这些匹配,则表示没有人修改了详细信息,因此如果发布者受信任,则证书中的详细信息也可以信任。
X.509证书以(右侧显示的数据类型)开头:
Certificate SEQUENCE
Data SEQUENCE
Version [0] { INTEGER }
Serial Number INTEGER
每个元素都以标记字节开头,表示元素类型,后跟元素长度,后跟元素内容。如果元素包含少于128个字节,则length字段仅需要一个字节来指定内容长度。如果它超过127个字节,则Length字段的第7位设置为1,第6位到第0位指定用于标识内容长度的附加字节数。对于X.509证书,Version包含在特定于上下文的标记[0]中。
解释ASN.1的书籍可以是来自网络的downloaded for free。
Here's an example for analysing the beginning of a certificate:
30 82 02 D7 30 82 02 40 A0 03 02 01 02 02 01 01 ...
Interpretation:
30 = Start of Certificate SEQUENCE
82 = sequence length are the following two bytes
02 D7 = sequence length 0x02D7 (Big Endian order of bytes)
30 = Start of Data SEQUENCE
82 = sequence length are the following two bytes
02 40 = sequence length 0x0240 (Big Endian order of bytes)
A0 = start of context-specific element [0]
03 = length of context-specific element [0]
02 01 02 = content of context-specific element [0] (Version INTEGER)
(02=start of Version INTEGER,
01=length of the integer,
02=Version value (zero-based, so value 02 actually means v3))
02 = Start of Serial Number INTEGER
01 = Length of Serial Number INTEGER
01 = The serial number itself
...
当然,在您的情况下,序列号的长度可能大于此处显示的一个字节。