クライアント証明書の引越しと、最後に灰色の魔女

 仕事でPCの入れ替えを依頼されることがあります。
 私の仕事は、広い意味では接客業にあたるので、クライアントのオーダーには常に語尾に「,sir!」をつけて承ります。承りかねる時でも、「いえ、できません」なんて否定しちゃうのはアマチュアのやること、プロのへりくだり屋さんたる私は、「その設定は可能ですが、運用面においてセキュリティに不安が残ります。いかが致しましょう?」みたいに言い換えて、顧客に「やらない」を選択させます。マジックにおけるフォースのように、自分に有利なようにことを勧めます。
 顧客は、パソコンの引っ越しってプロならすぐできるんでしょ?みたいに、こちらの技術への信頼が高いのか、技術を舐めているのかわからない憶断で、OFFICE用のマイクロソフトアカウントなんて用意していませんし、なんなら、「高い金払って保守料払ってんだから、そちらが全部管理してるでしょ」と言わんばかり。というか、そんな理不尽は実際に何度か言われた経験があります。
 そんなんだから、こっちもルートフォルダにプロダクトキーフォルダを作成してテキストで残しちゃうんですよね。こういうことやってるから、顧客の要望に期せずして応えてしまい、それが顧客の期待のハードルを上げる悪循環になるんです。
 さて、今回のオーダーは、ブラウザにインストールされたクライアント証明書を、新しいPCにインポートしてくれ、とのことです。普通なら、「クライアント証明書は、お客様自身を証明する大切なものとなります。高いリスクがある作業の為、向こうのサポートの指示で、お客様自身でやらないといけません。」みたいなことを言って逃げるんですが、今回は他業者はやってくれなかった、とのこと。
 私は、そういう文言でこられると、映画『Back to the Future』で、チキンと罵られると自動的に憤慨するマーティーのように、脳死で乗っかってしまいます。「別に設定してしまっても、構わんのだろう?」
 という訳で、秘密キー付きでインポートし、無事動作確認も終わりました。クライアントである社長も大喜び。いやあ、敗北が知りたいっすねえ。
 と、思っていたんですが、よくよく考えれば証明書については、インポートできるものとできないものの判別がつかなかったので調べてみました。
 そもそも、証明しようとするクライアントを、何によってサーバーは識別するのでしょうか(反語)?
 一般的にはユーザー名とそれに紐づくパスワードを知っているかを試します。しかし、この方法では、強奪する、盗むなどの良くない手段で知ってしまったパターンでもサーバーはその(当人ではないかもしれない)ユーザーを正当なものとして認証してしまいます。
 なので、知っているかどうかではなく、別の手段による認証も存在します。それが、証明書を持っているかをどうかをテストする方式です。
 この、知っている=知識、持っている=所有を、認証における要素と言います。この要素は三つあって、もう一つの指紋などを生体、という要素で、これらを合わせて認証の三要素と言います。この単要素を組み合わせた認証を多要素認証と呼び、IPA的には、よく試験で出てきますので要チェックです。
 で、今回は、クライアント証明書の所持による認証ですが、このクライアント証明書に何が書いてるのでしょう?これには、デジタル署名という技術が関わっているのですが、どうも私はこの技術の理解に必要な公開鍵暗号やRSAといった必須の知識が足りないので、かなり解像度を下げて考えます。
 クライアントがちゃんとしたクライアントかを検証したいサーバーは、自身や信頼できる組織が発行した証明書の情報を基に確認します。この証明には、証明書自身の内容と、クライアントのみが知り得る秘密鍵と呼ばれる秘密の数字が利用されます。この秘密の数字を使った計算によって、その所持(さらに、持っているその人)を確認します。
 この計算には、例えば、サーバーの任意の数字(例えば、これまでのやり取りのダイジェストだったり、乱数だったり)をクライアントに渡し、秘密鍵を利用し計算させ、自身が持っている該当の秘密鍵と対になる公開鍵を利用し計算した結果と任意の数字が一致した場合に、認証OKとします。
 つまり、この一連の所作においては、証明書の記載事項は、認証する内容と言えます。この内容を秘密鍵の処置によって正しいものかどうかが確認可能な状態になります。
 最初に戻って、今回のPC引っ越しの件で依頼された、証明書のインポートにはほとんどの場合、秘密鍵付きではインポート不可です。これは、証明書作成の際に、秘密キーの扱いを示すオプションで、「コピー不可」のフラグがチェック入っているからだそうです。
 この場合、証明する内容のみが引っ越しできて、その証明はできません。この状態を詳細に表すなら、証明書のコピーは可能だが、証明行為自体は不可である状態と言えましょう。竜頭蛇尾ってやつですね。
 このフラグの如何によって、やってあげる、あげないを決めても良いのかも。
  なので、運用的に言うなら、コピー不可フラグは言外の発行者のCP(証明書ポリシー)と言えるでしょう。と、すれば、マネジメント・レベルにおいては客に言われたからってそんなんやるんじゃねーぞ、ですがオペレーショナル・レベルにおいては、お客さん、コピー可能だったらいいっすよ!ということです。
 人と相対している以上、マイナスな発言はちょっとね、ということで現場的な防御手段検討のお話でした。

蛇頭①
 この話を書くために、今一度RSAについて確認が必要になり、Pythonのpow関数という奴で計算のリスト作ろうと思って、いろいろ頑張りましたが無理でした。
 ループごとにべき乗の数字を1ずつ上げていき、30までのべき乗を繰り返し、その数字をあげていくように作ってみました。しかし、なぜか、一つのpow関数のみを30回繰り返していました。なんじゃいこれ。
 休日の午前中フルで使ったのに……。
蛇足① 
 プログラミングやってて思ったんですが、作文とはこんな風に、どんなに間違っていようが文章は書けてしまいます。論理的に破綻していても、です。
 対して、プログラミングは要素だけ見ると、言葉、文、そして文法に沿って書くのは作文と変わらないんですが、結果は良くて変な動作、悪くてSyntax Error! となって機能しません。
 良い悪いの話ではなく、価値中立なものとしての特徴です。
 いわゆる文系に属する私は、分けるなら前者の文章を自然と書いています。しかし、プログラミング的なルールに遵守しないと機能しない文章の世界に触て、一歩外側に出て俯瞰することが可能となりました。その結果、自分の文章の文脈、あるいは少し言葉を強めるなら、自身が属する世界観の片鱗をなぞることができました。
 そういうのっていいなあ、と思った次第です。
 もう一つ、文系的な文章の話で言うと、別に論理破綻しているだけでなく、散文のような形で、ルールを超えた先に知見もあるよ、ということも付け加えねば、理系に偏りすぎて一方的過ぎますね。
 身内切りみたいにならないように、バランスとらねば。

この記事が気に入ったらサポートをしてみませんか?