• 検索結果がありません。

7. 鍵と証明書

7.8 証明書の生成

CyaSSLはx509 v3証明書の生成をサポートします。証明書生成はデフォルトではオフと

なっていますが、./coufigure過程で以下を使ってオンにすることができます:

--enable-certgen

また、Windowsや非標準の環境ではCYASSL_CERT_GENを定義してオンにすることも できます。

証明書を生成できるようにする前に、証明書のサブジェクトについての情報を準備する必 要があります。この情報はCertと命名されたcyassl/ctaocrypt/asn.hの構造体に含まれて います:

/* for user to fill for certificate generation */

typedef struct Cert {

int version; /* x509 version */

byte serial[SERIAL_SIZE]; /* serial number */

© 2011 – 2013 Sawtooth Consulting Limited

63

int sigType; /* signature algo type */

CertName issuer; /* issuer info */

int daysValid; /* validity days */

int selfSigned; /* self signed flag */

CertName subject; /* subject info */

} Cert;

ここにおいて、CertName は以下のような感じです:

typedef struct CertName { char country[NAME_SIZE];

char state[NAME_SIZE];

char locality[NAME_SIZE];

char org[NAME_SIZE];

char unit[NAME_SIZE];

char commonName[NAME_SIZE];

char email[NAME_SIZE];

} CertName;

サブジェクト情報を格納する前に、以下のような初期化関数を呼び出す必要があります:

Cert myCert;

InitCert(&myCert);

InitCert()は、バージョン番号を3(0x02)、シリアル番号を0(ランダムに生成)、

sigTypeをSHA_WITH_RSA、daysValid を 500、またselfSigned を 1 (TRUE)に.設定 するほか、いくつかの変数にデフォルト値を設定します。サポートされている署名タイプ にはMD5_WITH_RSA, SHA_WITH_RSA, またSHA256_WITH_RSAなどがあります。

これで、ctaocrypt/test/test.cからの例のように、サブジェクト情報を初期化することがで きるようになりました:

strncpy(myCert.subject.country, "US", NAME_SIZE);

strncpy(myCert.subject.state, "OR", NAME_SIZE);

© 2011 – 2013 Sawtooth Consulting Limited

64

strncpy(myCert.subject.locality, "Portland", NAME_SIZE);

strncpy(myCert.subject.org, "yaSSL", NAME_SIZE);

strncpy(myCert.subject.unit, "Development", NAME_SIZE);

strncpy(myCert.subject.commonName, "www.yassl.com", NAME_SIZE);

strncpy(myCert.subject.email, "[email protected]", NAME_SIZE);

次に、自己署名の証明書をgenKeyとmg変数を使って上記の鍵生成例から(もちろん、

有効なRsaKeyやRNGを使用可能です)生成することができます:

byte derCert[4096];

int certSz = MakeSelfCert(&myCert, derCert, sizeof(derCert), &key, &rng);

if (certSz < 0)

/* certSz contains the error */;

これでderCertバッファーにはDERフォーマットの証明書が格納されます。PENフォー

マットの証明書が必要な場合は汎用のDerToPem関数でCERT_TYPEをtypeに指定し て、以下のように生成することができます:

byte pemCert[4096];

int pemCertSz = DerToPem(derCert, certSz, pemCert, sizeof(pemCert), CERT_TYPE);

if (pemCertSz < 0)

/* pemCertSz contains error */;

以上でpemCert はPEMフォーマットの証明書を保持します。

CA署名の証明書を生成したい場合はさらに2、3のステップを必要とします。まず、サ ブジェクト情報を入れた後、CA証明書から発行者情報を設定する必要があります。これ はSetIssuer()で以下のようにできます:

ret = SetIssuer(&myCert, “ca-cert.pem”);

if (ret < 0)

/* ret contains error */;

© 2011 – 2013 Sawtooth Consulting Limited

65

次に、証明書を生成する2ステップのプロセスと、さらにそれに署名します

(MakeSelfCert()はこれら二つを一つのステップで行います)。発行者(caKey)とサブ ジェクト(key)の両方から非公開鍵を生成する必要があります。使用方法全体については test.cの例を参照してください。

byte derCert[4096];

int certSz = MakeCert(&myCert, derCert, sizeof(derCert), &key, &rng);

if (certSz < 0);

/* certSz contains the error */;

certSz = SignCert(&myCert, derCert, sizeof(derCert), &caKey, &rng);

if (certSz < 0);

/* certSz contains the error */;

以上でderCertバッファーにはDERフォーマットのCA署名された証明書が格納されま

す。PEMフォーマットの証明書が必要な場合は上の自己署名の例を参照してください。

© 2011 – 2013 Sawtooth Consulting Limited

66

関連したドキュメント