Posted at: 2018-02-28 07:49:36  Category: tech


ASN.1 (Abstract Syntax Notation One)はデータの構造を規定する抽象的な記法です。
こいつを元に実際にバイナリに落としこむエンコーディングとして、BERとかCERとかDERとかがあるみたいです。
(ERはEncoding Rulesを表す)


opensslコマンドでASN.1形式を確認することができます。
csrgenerator.comとかで適当なCSRを作ってみます。
※あんまりこういうサイトでCSRを生成するのはよくないと思います。秘密鍵も向こうが作ってます。

-----BEGIN CERTIFICATE REQUEST-----
MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCVVMxFDASBgNVBAMMC2V4YW1wbGUuY29t
MQ0wCwYDVQQHDARURVNUMQ0wCwYDVQQKDARURVNUMQ0wCwYDVQQIDARURVNUMQ0w
CwYDVQQLDARURVNUMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArqO7
DUvhSm2rGjzN7vW9vFEo1Wec2X0YyecZnIyrHx27mx9JI0bV4JmCOym99t4VOwEV
Gw7JQILQlrPptPE8abyPTL8kO6UyJcLneyKZWwyzFBYaf9B7bR+SCD+y+MLTlh8L
zbgMQaUiZ7Z1BoTfAkoWPZlMyGgbCddeNpafXogSOxnLo1F1tHnMVCD5KlNrBpEP
W5dajvyG6guYW7IUfn66/Q6y6AXqPoWRVVBqBq5tYV2Y8TXMg7/DyJFySV8RyaeA
rINVKWhqmzhdLhzJ2CpqwwKy6hth8xpdKkndv3CFz8izEEx6RvYv7vKsMeMRksuD
LVbXa/1gysSSLLWFMwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBADsCU6oR8i8r
RlCM3ElH7gsbmh8Ua11iicDvJf287E5G03XzCg0zZspdsQARWw6ZI9s06hQACL0E
OL1TUoOV0MVnFitRr8BhWXRtl8XcClkLmNOW8q1CyHkpdse0aF1h1efZh8Iph4W1
lZ7uAIppwJAfG52ObNjHVqCN/HYELY5xB+Fa0hMAm9Bb6lnU+XntAvrbtkDPwjpo
0UiXmydLNdfgcLEgX7+Jxkw3e6SVAlYLqhckhelSYV/Y98F4jSzm1NKVioab+/zR
+LJ6Wct7FK9XOMJg7apPk6uJmLKa29qWwhsHRERWLwlDfMXYgT3/+jbwoeV7v/FZ
3P4q3WeUZQU=
-----END CERTIFICATE REQUEST-----

こいつをopensslのasn1parseに食わせる下記のような感じになります。
$ cat << EOF | openssl asn1parse -i
> -----BEGIN CERTIFICATE REQUEST-----
> MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCVVMxFDASBgNVBAMMC2V4YW1wbGUuY29t
> MQ0wCwYDVQQHDARURVNUMQ0wCwYDVQQKDARURVNUMQ0wCwYDVQQIDARURVNUMQ0w
> CwYDVQQLDARURVNUMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArqO7
> DUvhSm2rGjzN7vW9vFEo1Wec2X0YyecZnIyrHx27mx9JI0bV4JmCOym99t4VOwEV
> Gw7JQILQlrPptPE8abyPTL8kO6UyJcLneyKZWwyzFBYaf9B7bR+SCD+y+MLTlh8L
> zbgMQaUiZ7Z1BoTfAkoWPZlMyGgbCddeNpafXogSOxnLo1F1tHnMVCD5KlNrBpEP
> W5dajvyG6guYW7IUfn66/Q6y6AXqPoWRVVBqBq5tYV2Y8TXMg7/DyJFySV8RyaeA
> rINVKWhqmzhdLhzJ2CpqwwKy6hth8xpdKkndv3CFz8izEEx6RvYv7vKsMeMRksuD
> LVbXa/1gysSSLLWFMwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBADsCU6oR8i8r
> RlCM3ElH7gsbmh8Ua11iicDvJf287E5G03XzCg0zZspdsQARWw6ZI9s06hQACL0E
> OL1TUoOV0MVnFitRr8BhWXRtl8XcClkLmNOW8q1CyHkpdse0aF1h1efZh8Iph4W1
> lZ7uAIppwJAfG52ObNjHVqCN/HYELY5xB+Fa0hMAm9Bb6lnU+XntAvrbtkDPwjpo
> 0UiXmydLNdfgcLEgX7+Jxkw3e6SVAlYLqhckhelSYV/Y98F4jSzm1NKVioab+/zR
> +LJ6Wct7FK9XOMJg7apPk6uJmLKa29qWwhsHRERWLwlDfMXYgT3/+jbwoeV7v/FZ
> 3P4q3WeUZQU=
> -----END CERTIFICATE REQUEST-----
> EOF
0:d=0 hl=4 l= 676 cons: SEQUENCE
4:d=1 hl=4 l= 396 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
11:d=2 hl=2 l= 95 cons: SEQUENCE
13:d=3 hl=2 l= 11 cons: SET
15:d=4 hl=2 l= 9 cons: SEQUENCE
17:d=5 hl=2 l= 3 prim: OBJECT :countryName
22:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
26:d=3 hl=2 l= 20 cons: SET
28:d=4 hl=2 l= 18 cons: SEQUENCE
30:d=5 hl=2 l= 3 prim: OBJECT :commonName
35:d=5 hl=2 l= 11 prim: UTF8STRING :example.com
48:d=3 hl=2 l= 13 cons: SET
50:d=4 hl=2 l= 11 cons: SEQUENCE
52:d=5 hl=2 l= 3 prim: OBJECT :localityName
57:d=5 hl=2 l= 4 prim: UTF8STRING :TEST
63:d=3 hl=2 l= 13 cons: SET
65:d=4 hl=2 l= 11 cons: SEQUENCE
67:d=5 hl=2 l= 3 prim: OBJECT :organizationName
72:d=5 hl=2 l= 4 prim: UTF8STRING :TEST
78:d=3 hl=2 l= 13 cons: SET
80:d=4 hl=2 l= 11 cons: SEQUENCE
82:d=5 hl=2 l= 3 prim: OBJECT :stateOrProvinceName
87:d=5 hl=2 l= 4 prim: UTF8STRING :TEST
93:d=3 hl=2 l= 13 cons: SET
95:d=4 hl=2 l= 11 cons: SEQUENCE
97:d=5 hl=2 l= 3 prim: OBJECT :organizationalUnitName
102:d=5 hl=2 l= 4 prim: UTF8STRING :TEST
108:d=2 hl=4 l= 290 cons: SEQUENCE
112:d=3 hl=2 l= 13 cons: SEQUENCE
114:d=4 hl=2 l= 9 prim: OBJECT :rsaEncryption
125:d=4 hl=2 l= 0 prim: NULL
127:d=3 hl=4 l= 271 prim: BIT STRING
402:d=2 hl=2 l= 0 cons: cont [ 0 ]
404:d=1 hl=2 l= 13 cons: SEQUENCE
406:d=2 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption
417:d=2 hl=2 l= 0 prim: NULL
419:d=1 hl=4 l= 257 prim: BIT STRING

SEQUENCEコンストラクタは、順序つけられたデータの構造を表し、
SETは順序が関係ないデータの集まりを表しているっぽいです。

左のd=とかhl=とかl=は何らかデータ(ヘッダとか)の長さとかオフセットを表している様な気がしますが
ちゃんと見方を調べられてないです。