在Oracle存储过程中解析base64 X509证书?

时间:2012-10-28 07:29:17

标签: oracle plsql base64 x509

我有基本64二进制格式的证书x509。如何使用Oracle检索有关证书的信息?我必须得到这个证书的序列号。有什么想法吗?

2 个答案:

答案 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
    ...

当然,在您的情况下,序列号的长度可能大于此处显示的一个字节。