jc.parsers.x509_csr
jc - JSON Convert X.509 Certificate Request format file parser
This parser will convert DER and PEM encoded X.509 certificate request files.
Usage (cli):
$ cat certificateRequest.pem | jc --x509-csr
Usage (module):
import jc
result = jc.parse('x509_csr', x509_csr_file_output)
Schema:
[
{
"certification_request_info": {
"version": string,
"serial_number": string, # [0]
"serial_number_str": string,
"signature": {
"algorithm": string,
"parameters": string/null,
},
"issuer": {
"country_name": string,
"state_or_province_name" string,
"locality_name": string,
"organization_name": array/string,
"organizational_unit_name": array/string,
"common_name": string,
"email_address": string,
"serial_number": string, # [0]
"serial_number_str": string
},
"validity": {
"not_before": integer, # [1]
"not_after": integer, # [1]
"not_before_iso": string,
"not_after_iso": string
},
"subject": {
"country_name": string,
"state_or_province_name": string,
"locality_name": string,
"organization_name": array/string,
"organizational_unit_name": array/string,
"common_name": string,
"email_address": string,
"serial_number": string, # [0]
"serial_number_str": string
},
"subject_public_key_info": {
"algorithm": {
"algorithm": string,
"parameters": string/null,
},
"public_key": {
"modulus": string, # [0]
"public_exponent": integer
}
},
"issuer_unique_id": string/null,
"subject_unique_id": string/null,
"extensions": [
{
"extn_id": string,
"critical": boolean,
"extn_value": array/object/string/integer # [2]
}
]
},
"signature_algorithm": {
"algorithm": string,
"parameters": string/null
},
"signature_value": string # [0]
}
]
[0] in colon-delimited hex notation
[1] time-zone-aware (UTC) epoch timestamp
[2] See below for well-known Extension schemas:
Basic Constraints:
{
"extn_id": "basic_constraints",
"critical": boolean,
"extn_value": {
"ca": boolean,
"path_len_constraint": string/null
}
}
Key Usage:
{
"extn_id": "key_usage",
"critical": boolean,
"extn_value": [
string
]
}
Key Identifier:
{
"extn_id": "key_identifier",
"critical": boolean,
"extn_value": string # [0]
}
Authority Key Identifier:
{
"extn_id": "authority_key_identifier",
"critical": boolean,
"extn_value": {
"key_identifier": string, # [0]
"authority_cert_issuer": array/null,
"authority_cert_issuer_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
],
"authority_cert_serial_number": string/null
}
}
Subject Alternative Name:
{
"extn_id": "subject_alt_name",
"critical": boolean,
"extn_value": [
string/object
],
"extn_value_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
]
}
Issuer Alternative Name:
{
"extn_id": "issuer_alt_name",
"critical": boolean,
"extn_value": [
string/object
],
"extn_value_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
]
}
Certificate Policies:
{
"extn_id": "certificate_policies",
"critical": boolean,
"extn_value": [
{
"policy_identifier": string,
"policy_qualifiers": [ array or null
{
"policy_qualifier_id": string,
"qualifier": string
}
]
}
]
}
Signed Certificate Timestamp List:
{
"extn_id": "signed_certificate_timestamp_list",
"critical": boolean,
"extn_value": string # [0]
}
Authority Information Access:
{
"extn_id": "authority_information_access",
"critical": boolean,
"extn_value": [
{
"access_method": string,
"access_location": string/object,
"access_location_type": string # [4]
}
]
}
Subject Information Access:
{
"extn_id": "subject_information_access",
"critical": boolean,
"extn_value": [
{
"access_method": string,
"access_location": string/object,
"access_location_type": string # [4]
}
]
}
CRL Distribution Points:
{
"extn_id": "crl_distribution_points",
"critical": boolean,
"extn_value": [
{
"distribution_point": [
string/object
],
"distribution_point_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
],
"reasons": array/null,
"crl_issuer": [
string/object
],
"crl_issuer_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
]
}
]
}
Freshest CRL:
{
"extn_id": "freshest_crl",
"critical": boolean,
"extn_value": [
{
"distribution_point": [
string/object
],
"distribution_point_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
],
"reasons": array/null,
"crl_issuer": [
string/object
],
"crl_issuer_general_names": [ # [3]
{
"type": string, # [4]
"value": string/object
}
]
}
]
}
Name Constraints:
{
"extn_id": "name_constraints",
"critical": boolean,
"extn_value": {
"permitted_subtrees": [
{
"base": string/object,
"base_type": string, # [4]
"minimum": integer,
"maximum": integer/null
}
],
"excluded_subtrees": [
{
"base": string/object,
"base_type": string, # [4]
"minimum": integer,
"maximum": integer/null
}
]
}
}
[3] present when the field before it is a list of GeneralNames
[4] GeneralName type: dns_name, rfc822_name, uniform_resource_identifier,
ip_address, directory_name, registered_id, other_name, x400_address
or edi_party_name
Examples:
$ cat server.csr| jc --x509-csr -p
[
{
"certification_request_info": {
"version": "v1",
"subject": {
"common_name": "myserver.for.example"
},
"subject_pk_info": {
"algorithm": {
"algorithm": "ec",
"parameters": "secp256r1"
},
"public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
},
"attributes": [
{
"type": "extension_request",
"values": [
[
{
"extn_id": "extended_key_usage",
"critical": false,
"extn_value": [
"server_auth"
]
},
{
"extn_id": "subject_alt_name",
"critical": false,
"extn_value": [
"myserver.for.example"
],
"extn_value_general_names": [
{
"type": "dns_name",
"value": "myserver.for.example"
}
]
}
]
]
}
]
},
"signature_algorithm": {
"algorithm": "sha384_ecdsa",
"parameters": null
},
"signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
}
]
$ openssl req -in server.csr | jc --x509-csr -p
[
{
"certification_request_info": {
"version": "v1",
"subject": {
"common_name": "myserver.for.example"
},
"subject_pk_info": {
"algorithm": {
"algorithm": "ec",
"parameters": "secp256r1"
},
"public_key": "04:40:33:c0:91:8f:e9:46:ea:d0:dc:d0:f9:63:2..."
},
"attributes": [
{
"type": "extension_request",
"values": [
[
{
"extn_id": "extended_key_usage",
"critical": false,
"extn_value": [
"server_auth"
]
},
{
"extn_id": "subject_alt_name",
"critical": false,
"extn_value": [
"myserver.for.example"
],
"extn_value_general_names": [
{
"type": "dns_name",
"value": "myserver.for.example"
}
]
}
]
]
}
]
},
"signature_algorithm": {
"algorithm": "sha384_ecdsa",
"parameters": null
},
"signature": "30:45:02:20:77:ac:5b:51:bf:c5:f5:43:02:52:ae:66:..."
}
]
parse
def parse(data: str | bytes,
raw: bool = False,
quiet: bool = False) -> List[Dict]
Main text parsing function
Parameters:
data: (string or bytes) text or binary data to parse
raw: (boolean) unprocessed output if True
quiet: (boolean) suppress warning messages if True
Returns:
List of Dictionaries. Raw or processed structured data.
Parser Information
Compatibility: linux, darwin, cygwin, win32, aix, freebsd
Source: jc/parsers/x509_csr.py
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)