2015年11月27日金曜日

opensslでこさえたオレオレ認証局からWindows向けのコードサイニング用証明書も発行する

現時点でオレオレ認証局を運用していて、当然クライアントにもオレオレルート証明書が入ってる人向けの、とても需要がないこと請け合いの記事です。

なお、EVコード署名証明書の話題ではありませんので念のため。
あれはWHQLが通らない開発元でもMicrosoftに署名してもらいたい時に保証人業者が自分のことを証明してくれてるから信じてね!、という提出用書類なのでこの話題とは関係ございません。

さて、最近はクラウドだとかで個人で使うにも敷居がどーんと下がってきて需要が下がってきていることとは思いますが、まだまだ現在でも個人や小規模なグループで、自分たちの存在を第三者に証明する必要はないが自分たちがサーバにアクセスする際には経路の暗号化は必要ですから、やっぱりオレオレ認証局と証明書は便利です。

それにタダですからね。
コマンドを打ち込む時間を抜きにすれば。

ところで、最近、Windowsはちょっとしたオレオレドライバも証明書を付けないとロードしてくれなくなっています。

ついにWindows10はカーネルモードドライバに限っては必ずMSの認証が必要になってしまって、あまり大きくない測器屋さんとかの独自ハードを作っておいでのところや、個人で大枚払ってコードサイニング証明書を買ってまで自作ソフトを公開していた方が、さらに新しい証明書を買わないとダメですよー的にごっそり切り捨てられて、一部界隈ではちょっとした話題になっちゃいまいた。

ソフト屋としては自由度が減れば減るほどちょっと寂しいのですが、一方で「なにもしてないのに」ウィルスにかかっちゃうエロおやじうっかりさんどころか、本当にまっとうと思われていたサイトにアクセスしても、広告が乗っ取られていてFLASHとかブラウザの脆弱性のせいでウィルスに冒されたり、サイバー攻撃を受けたら軍事的攻撃とみなす、とか、米中首脳会談の主要議題の一つにまでなってしまうとか、ことほど左様にコンピュータへの攻撃が激しい昨今ですから、笑い事ではありません。まさに生き馬の目を抜くような、という世界に一般の人までも巻き込まれてしまう情勢です。そこに「PCってなんスか?」とか、情報教育を受けたとか聞いていたはずの若者が雪崩れ込んで来て、もはや阿鼻叫喚の地獄絵図です(情報教育ってなんスかね。年寄りには想像もつかないわ)。

Microsoftだって商売ですから、自由にモノづくりができる環境と安心して作業できる環境とでは、もはや後者を優先せざるを得ないでしょうし、この流れはWindowsだけでは済まないだろうなあ、と思います。

話がずれてしまいました。
そんなこたぁオレオレ前提な以上、使う側はわかって使うのでどうでもいいわけで、実際にはWindowsでも起動オプションで署名されていないドライバでもロードできるわけです。

が、ちと、手続きが面倒くさい。

そこでオレオレコード署名証明書の出番となるわけですが、どうせテストだから、仮だから、とか言って適当に作りまくっていると証明書ストアが汚れていくのでなんかイヤ。

しかも、そういう向きにはオレオレルート証明書は使用しているクライアントに当然入っているわけです。

従って、そのオレオレルート証明書を発行した当のオレオレ認証局にオレオレコード署名も発行してもらえばいいわけです。

win-win, *nix-*nixなら別にどうということもないでしょうから、ここでは、opensslで構築したオレオレ認証局に署名してもらったコード署名証明書をWindowsのデバイスドライバに署名する方法を記述します。

やるこたぁ単純です。ですが、自分がどの立場で作業しているか、だけは意識してください。
※ 当然認証局がコード署名に対応していないとダメですよ!
opensslの定義体の [ v3_req ] の keyUsage  エントリで、codeSigningが指定されていることを確認してくださいね!
Ex). keyUsage = nonRepudiation, digitalSignature, keyEncipherment, codeSigning

具体的には以下となります。
  1. opensslで構築した認証局側で、オレオレコード証明書を認証してください、とオレオレ認証局に対して申請書を書きます。
    その申請書のために、まず秘密鍵を生成します。まあ、長さは2048でいっときましょう。

    # openssl genrsa -des3 -out オレオレコード認証秘密鍵 2048

    ※ オレオレコード認証秘密鍵は、せめてchmod 600しておいたほうがいいですね

    次に、実際のコード署名証明書の申請書を書きます。
    今はやりのSHA-256がいいかな、と。

    # openssl req -new -sha256 \
                -config  あらかじめCN等を定義しておいた定義体があるなら指定してください \
                -days 10000日くらい。どうせ近いうちにまた暗号強度がドーとか言われて作り直しさ \
                -key オレオレコード認証秘密鍵 \
                -out 認証要求のお願いの申請書
  2. コード証明認証要求が届いたので、今度は認証局側の立場で申請書を認証します。

    # openssl ca \
                 -config  認証局を作った時の設定ファイルを指定すると楽です \
                 -in 認証要求のお願いの申請書 \
                 -cert 認証局の証明書 \
                 -keyfile 認証局の秘密鍵 \
                 -out オレオレコード署名証明書
  3. オレオレコード署名証明書が届いたので、今度は申請者側に戻ってWindowsでも利用できる形式に変換します。

    # openssl pkcs12 -export \
                 -in オレオレコード署名証明書 \
                 -inkey オレオレコード認証秘密鍵 \
                 -out Windowsで署名するためのpfx形式のファイル.pfx
  4. 実際にWindowsでファイルに署名します。

    X:\signtool.exe sign  /a /f Windowsで署名するためのpfx形式のファイル.pfx  /p パスワード 対象ドライバ名.sys

    ※パスワードは平文です。。。

    なお、signtool.exeは各OSのSDKに入っています。
    Windows10 は こちら

    説明するのが楽なのでVisual Studio の Community Editionを推薦する人も多いんですが、自分がライセンス的に使えるかどうかだけはどうか意識してください。
    さもないと真綿で自分の首を絞めることになります。
    MSは確かに昔から開発者に対して親和的だと(個人的には)言って憚りませんが、不正利用が蔓延ってしまったら彼らだって手を引いてしまいます。
うーん、なんだか和文で書くとかえってわけがわからない感じになってしまった気もします。
そもそも、こんな話題、誰が読むんだろうか。
そして、読んでいただいたとして、まさに釈迦に説法ではなかろうか。

何でこんな記事を書いたかというと、某所で壮絶な勘違いを見てしまって。。。
いやまてよ、自分が壮絶な勘違いをしている可能性のほうが高いですね。経験上、バグを見つけたら原因は自分をまず疑うと解決が速まりますから。

なお、当然ながらsecdrv.sysの署名m




0 件のコメント:

コメントを投稿