u-ryo's blog

various information for coding...

Category: Tls

Illegal Keysize

| Comments

AndroidでNanoHTTPDを 動かすprogramを開発しているんですが、 WebRTCにするのに、TLSが必要じゃないですか。 そのserver certを普通に作ると、Illegal keysizeと言われて key load時に落ちるのでハマりました。 NanoHTTPDの解説にあるように、

1
$ keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048 -ext SAN=DNS:localhost,IP:127.0.0.1  -validity 9999

と作ってもダメでした。 色々調べると、AndroidにはBouncyCastle(BKS)でないとならないらしく、 証明書は面倒なのでsnakeoilを流用して、

1
2
$ sudo openssl pkcs12 -export -in /etc/ssl/certs/ssl-cert-snakeoil.pem -inkey /etc/ssl/private/ssl-cert-snakeoil.key -out ~/AndroidStudioProjects/SharedEye/ssl-cert-snakeoil.p12 -name ssl-cert-snakeoil
$ /usr/lib/jvm/java-8-oracle/bin/keytool -importkeystore -deststorepass password -destkeypass password -destkeystore snakeoil.jks -srckeystore ssl-cert-snakeoil.p12 -srcstoretype PKCS12 -srcstorepass password -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15-1.46.jar

とすると、

1
Problem importing entry for alias java.security.KeyStoreException: java.io.IOException: Error initialising store of key store: java.security.InvalidKeyException: Illegal key size.

と言われてimport出来ませんでした(→jksが作れませんでした)。 かなり悩んだのですが、結局JavaでAES256を使用できるようにするにあるように、 JCE(Java Cryptography Extension)を落としてきて local_policy.jarを上書きしたら、 jksも出来て、Android側でも何事もなくloadしてくれました。