2012年7月10日火曜日

OpenSSLを使ったファイルハッシュ計算方法

openssl.exeを使った方法と、C++でライブラリを呼び出して計算してみる2パターンをメモ。

【SHA1の場合】
openssl.exe sha1 [ファイル名]

Visual Studioを使ったC++(コンソールアプリ)のサンプルは下記のような感じになります。
サンプルではWindows8 RP版のisoイメージのファイルハッシュを計算してテストしてみました。
#include "stdafx.h"
#include "Hash.h" // OpenSSLのinclude

#define TARGET_FILE "E:\\Windows8-ReleasePreview-32bit-Japanese.iso"
#define BUFSIZE (1024 * 16) // OpenSSLの定義と同じ

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char sha1hash[SHA_DIGEST_LENGTH] = { 0 };
    unsigned char buf[BUFSIZE];
    DWORD dwStart = 0;
    DWORD dwEnd = 0;

    // SHA1 using OpneSSL lib
    printf("Calculate file hash for sha1\n");
    dwStart = ::GetTickCount();
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    CFile file(TARGET_FILE, CFile::modeRead);
    UINT nRead = 0;

    do{
        nRead = file.Read(buf, BUFSIZE);
        if(nRead > 0){
            SHA1_Update(&ctx, buf, nRead);
        }
    }while(nRead == BUFSIZE);
 
    SHA1_Final(sha1hash, &ctx);
    dwEnd = ::GetTickCount() - dwStart;

    printf("SHA1(%s)= ", TARGET_FILE);
    for(int i = 0; i < SHA_DIGEST_LENGTH; i++){
        printf("%.2x",sha1hash[i]);
    }
    printf("\n");
    printf("Elapsed Time(ms) = %d\n", dwEnd);

    return 0;
}
※OpenSSLライブラリとは、stdafx.hで下記のように書くか、設定画面でリンクの設定をしてください。
// OpenSSL lib
#pragma comment(lib, "openssl/lib/libeay32.lib")
#pragma comment(lib, "openssl/lib/ssleay32.lib")

【MD5の場合】
openssl.exe md5 [ファイル名]

ソースの方はMD5_~に変わるだけで、あとは全く同じなので省略します。

Visual Studio registry capture utility のエラー解決方法

久しぶりにCOM連携アプリケーションをビルドしたら下記エラーがでました。
Visual StudioのSetupプロジェクトで、tlbファイルを依存関係に追加している場合、
Windows7(x64)環境下で発生するようです。ちなみにVisual Studioは2005です。













Google先生に聞いて、下記ブログを参考に解決できました。
[VS2010]Registry Capture Utilityが動作停止する問題 - とりあえず解決
 
すぐ忘れそうなのでメモしておきます。
解決方法としては、regcap.exeのプロパティを開いて、互換モードを
Windows Vista (Service Pack2)に変更すれば良いみたいです。

[regcap.exeの場所]
C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\Deployment\regcap.exe
※VS2008やVS2010でもCommon7以下のパスは同じです

2012年6月16日土曜日

[WinJS] CP版の Metro Style アプリをRP版に移行する時のメモ

Javascriptで作っていたメトロアプリが案の定動かなくなったので、その時の移行のメモです。
動的言語なので、オブジェクトの中身が変わっていても実行時にしかわからないのが痛いですね。
CP版のVS11で作成したアプリを、RP版のVS2012でビルドしなおす場合を想定しています。

(1) WinJSの参照をやり直す
CP版は0.6だったのですが、1.0.RCというバージョンになっています。
なので、一度参照を削除して再度追加してやる必要があります。



(2) default.htmlの参照を修正する
下記のように、WinJSへの参照の部分を、Microsoft.WinJS.0.6からMicrosoft.WinJS.1.0.RCに修正します。WinJSの参照をしなおしただけでは、自動で変わりませんので注意してください。


(3) RC版での変更に対応する
ビルドしただけでは分かりませんので、基本的には実行してみてエラーになった個所を潰していく感じになると思います。

Consumer Preview 以降のアプリ開発者向けの変更点
http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/06/07/consumer-preview.aspx

移行ガイド (英語)
http://go.microsoft.com/fwlink/?LinkID=251943


(4) WinJS.xhrでHttpWebRequestを行っていた場所を見直す
前述の移行ガイドでも見当たらなかったのですが、responseXMLの型が変更になっているみたいです。CP版の場合は、MSXMLに由来するMS独自拡張のselectNodesやselectSilgleNodeでXPath式を使って操作ができたのですが、RP版では変更(削除)されたようです。なので、これらを使っているプロジェクトの場合、実行時にエラーになります。

解決方法としては、新たにSelectors APIが使えるようになっていますので、querySelectorAllとかquerySelectorを代わりに使います。こちらは引数がCSSセレクタですので、XPath式からの書き換えも忘れずに。

例えば下記のように書き換えます。


item.selectSilgleNode("title").text; // CP版
↓
item.querySelector("title").textContent; //RP版


Release Candidate: Did responseXML change at all? selectNodes isn't a method anymore...
http://social.msdn.microsoft.com/Forums/sv-SE/winappswithhtml5/thread/2141429b-b7d3-46ef-a46b-5919e41d454f




2012年4月10日火曜日

OpenSSLでの証明書関連コマンドメモ

何回やっても覚えられないので・・・。自分用にまとめておきます。
IISで作成したCSRを署名したい場合は、CAによる署名を行った後、
DERに変換してやれば良いです。

・秘密鍵の作成
openssl genrsa -out keyfile.pem 2048

・CSRの作成
openssl req -new -key keyfile.pem -out csrfile.pem

・自己署名
openssl x509 -req -in csrfile.pem -signkey keyfile.pem -out certfile.pem

・CAによる署名
openssl ca -out certfile.pem -infiles csrfile.pem

・CAによる失効
openssl ca -revoke certfile.pem

・CRL発行
openssl ca -gencrl -out crl.pem

・CRL変換
openssl crl -in crl.pem -outform DER -out crl.der

・PEM->DER
openssl x509 -in file.pem -outform DER -out file.der

・DER->PEM
openssl x509 -inform DER -in file.der -outform PEM -out file.pem

・PKCS#12作成
openssl pkcs12 -export -in certfile.pem -inkey keyfile.pem -certfile rootca.pem -out file.p12

・PKCS#12作成(CAチェーンつき) ca.pem内に複数証明書を入れておく
openssl pkcs12 -export -in certfile.pem -inkey keyfile.pem -chain -CAfile ca.pem -out file.p12

・PKCS#12から秘密鍵のみ取り出す(暗号化の必要なければ-nodesをつける)
openssl pkcs12 -in input.pfx -nocerts -out output_key.pem

・PKCS#12からサーバー証明書のみ取り出す
openssl pkcs12 -in input.pfx -clcerts -nokeys -out output_crt.pem

・RSA秘密鍵のパスフレーズ削除
openssl rsa -in server.key -out server.key

※ファイル名は適当ですので読み替えてください

2011年2月19日土曜日

WASでnet.tcpやnet.pipeを使おうとするとエラーになる

IISのWAS(Windowsプロセスアクティブ化サービス)によるhttp以外のプロトコルによる
ホスティングを試そうと、有効なプロトコルにnet.tcpとnet.pipeを追加しました。



そうしたら下記エラーが発生。

プロトコル 'net.tcp' には、登録されている HostedTransportConfiguration 型が実装されていません

相変わらず全く意味が分かりませんね・・・。
原因は、Windowsの機能が一部インストールされていないからでした。
デフォルトでは入っていないみたいなので、注意してください。

2011年2月13日日曜日

参照設定で System.ServiceModel.Web が出て来ない

Visual Studio 2010 でWCFを使ってRESTfulサービスを作る場合は、下記参照の追加が必要です。
(コントラクトでWebGetAttributeなどを指定するため)

System.ServiceModel.Web

VS2010のWCFテンプレートを使ってプロジェクトを作成した場合、そのままでは参照の追加に出てきません。
プロジェクトのプロパティから[対象のフレームワーク]を変更してやる必要があるみたいです。


デフォルトでは.NET Framework 4 Client Profileになっていますが、.NET Framework 4に変更します。
Client Profileにはサーバーアプリケーション開発に必要なコンポーネントが含まれていないため、
このような操作が必要になってきます。

2011年1月31日月曜日

URL Rewrite 2.0 でURLやサーバー変数を書き換える

今回はIIS7で、URLやサーバー変数を書き換える方法のメモです。
アプリケーション側の都合で構成を変えたいが、公開URLは変更したくない場合などに有効です。
Apacheのmod_rewriteと同じようなことができます。

導入は、Microsoft Web Platform Installer 3.0を使うのが簡単です。
ますは、こちらからインストールしてください。


[製品] - [サーバー] の中から、[URL Rewrite 2.0] を見つけて追加ボタンを押します。


その後、下部の[インストール]ボタンを押し、続けて同意ボタンを押し終わるのを待ちます。
場合によっては依存関係にあるモジュールも自動でインストールされます。

※ここでは詳しく説明しませんが、リバースプロキシを構築したい場合は
   ARR (Application Request Routing) モジュールも必要です。


インストールが完了したら、IISマネージャーを起動します。
Default Web Siteを選択すると、「URL 書き換え」という機能が追加されているのが分かります。
ダブルクリックするか、右上の[機能を開く]を選択して設定画面を出します。
(全てのサイトにURL書き換えルールを適用したくない場合は、目的の仮想ディレクトリに移動して、
URL書き換え設定画面を開いてください)


右上の[規則の追加]を選択します。


「空の規則」を選択してOKを押します。


この画面で書き換えルールを設定します。


[名前]
作成するルールに好きな名前を付けます

[URLの一致]
正規表現 or ワイルドカード or 完全一致した場合だけ書き換えることができます。
正規表現での指定がオススメです。括弧で括っておくと、書き換えルールで変数として使えます。

たとえば、「(.*)/(.*)/.*」とした場合、{R:n}を書き換えルールで使うことができます。

{R:0} これはURL全体を指します
{R:1} これは一番目の括弧でマッチした文字列になります
{R:2} これは二番目の括弧でマッチした文字列になります


サーバー変数だけで判断したい場合は、すべて(.*)にしておいて、[条件]で指定します。

[条件]
IISのサーバー変数に一致した場合のみ書き換えを行いたい時は、ここで条件指定します。
また、サーバー変数を書き換えルールに使いたい場合もここで指定します。
書き換えルールでの指定は{C:n}になります。

[サーバー変数]
サーバー変数の書き換えを行いたい場合はここで指定します。
事前に書き換えマップに書き換えたいサーバー変数を登録しておく必要がありますので
注意してください。(URL Rewrite設定画面Topの右側メニュー[書き換えマップの表示]から行います)

[アクション]
URLの書き換えルールを設定します。
前述の変数を利用して、http://{R:1}/{C:1}/index.htmlなどと動的な書き換えもできます。
サーバー変数の書き換えだけが目的の場合はアクションは「なし」にしておきます。

ルールの設定が完了したら、右上の適用ボタンを押して保存してください。
すぐにルールが反映されるはずです。(IISの再起動は不要)


【参考】
設定方法の詳細は、下記のTechNetのページが参考になると思います。

URL 書き換えモジュールの送信ルールの作成

HTTP 要求ヘッダーおよび IIS サーバー変数の設定 (サーバー変数を書き換えたい場合)

URL 書き換え Version 2 と Application Request Routing を使用したリバース プロキシ


【補足】
IIS6の場合はURL Rewrite 2.0は使えませんが、
IIRF (Ionic's Isapi Rewrite Filter) というツールを使うと、ほぼ同じことができます。