7月 182012
 

※あまり詳しい事は調べてない。

内部httpサーバーが302responseを返した際に、Locationヘッダをhttpsに書き換えてくれないため、httpにリダイレクトされてしまう。

[squid-users] SSL rev proxy, redirector, 302 problems from Jesse Reynolds on 2003-12-03 (squid-users)

回避策は調べてない。

Squid3では’Front- End-Https: On’で対処可能な模様?

7月 182012
 
C:\example\>keytool -genkey -alias ssltest -keyalg RSA -keysize 512 -keypass password -validity 3650 -storetype JKS -keystore server_keystore -storepass password
姓名を入力してください。
  [Unknown]:  hostname
組織単位名を入力してください。
  [Unknown]:  ou
組織名を入力してください。
  [Unknown]:  o
都市名または地域名を入力してください。
  [Unknown]:  Japan
州名または地方名を入力してください。
  [Unknown]:  Tokyo
この単位に該当する 2 文字の国番号を入力してください。
  [Unknown]:  JP
CN=hostname, OU=ou, O=o, L=Japan, ST=Tokyo, C=JP でよろしいですか?
  [no]:  yes

C:\example\>keytool -selfcert -alias ssltest -validity 3650 -keystore server_keystore
7月 182012
 

JKSキーストアを事前に用意し、JavaオプションにhttpsPorthttpsKeyStorehttpsKeyStorePasswordを指定すれば良い。

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --httpsPort=8081 --httpsKeyStore=d:\example\server_keystore --httpsKeyStorePassword=password</arguments>

これでhttps://localhost:8081/でHTTPSアクセスできる。

7月 122012
 

RSAの話。

modulusをpublicKey.getModulus().toByteArray()で取得した際くっついてくる符号ビットが曲者。。
※BigInteger#toByteArrayは符号ビット付き2の補数表現となる
符号ビット1bit + モジュラス本体1024bit(鍵長1024bitの場合) → 129ByteのByte配列
となるため、C#のRSAParameters.Modulusに突っ込むには先頭の符号ビットに相当する1バイトを削って渡す必要がある。
ヘルプに何にも書いてないので謎だが、符号なしにしないとだめなようで。。
as3cryptoはそのまま突っ込んでも大丈夫なのに・・・

PrivateExponentはJavaでしか処理しないためそのままでも問題なく、PublicExponentについては17bit(65537固定)のデータのため、符号ビット”0″が付加されても無害。
(modulusは1024bit(8bitの倍数)なため符号ビットを付加するとあふれて129Byteになってしまうのが今回の場合問題となる)

キーペア作成@Java
//鍵作る
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
KeyPair keyPair = generator.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate(); //Javaでとっとく
RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();

//modulusの先頭符号ビットを除去
byte[] modulusBytes = stripLeadingZeros(publicKey.getModulus().toByteArray());

//Bse64エンコードしてC#へわたす
BASE64Encoder encoder = new BASE64Encoder();
String modulus = encoder.encode(modulusBytes); //→C#に渡す
String publicExponent = encoder.encode(publicKey.getPublicExponent().toByteArray()); //→C#に渡す
暗号化@C#
//鍵の取り込み
RSAParameters rsaParams = new RSAParameters();
rsaParams.Modulus = Convert.FromBase64String(modulus); //Javaから受け取る
rsaParams.Exponent = Convert.FromBase64String(exponent); //Javaから受け取る

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
rsaProvider.ImportParameters(rsaParams);

//暗号化してJavaに渡す
byte[] targetBytes = new UTF8Encoding().GetBytes(target); //target:暗号化対象文字列。UTF-8でバイト配列化
//とりあえずPKCS#1パディング。第二引数をtrueにすればOAEPパディングも使える。
byte[] resultBytes = rsaProvider.Encrypt(targetBytes, false);
string result = Convert.ToBase64String(resultBytes); //Javaに返す
復号化@Java
BASE64Decoder decoder = new BASE64Decoder();
byte[] src = decoder.decodeBuffer(cryptedData); //cryptedData:C#から受け取る

//ここでパディングや暗号化サービスプロバイダを指定できる。
//"RSA"は"RSA/ECB/PKCS1Padding"と同じ。
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey); //とっておいた秘密鍵で初期化
byte[] resultBytes = cipher.doFinal(src);
String result = new String(resultBytes, "UTF-8"); //復号結果。UTF-8で復元