詳細なレポートありがとうございます。
「session id context uninitialized」と言ってるので、sid_ctx オプションで session id context を設定してみてもらえますか?
例えば、
-dd
-z tls1
-z sid_ctx=test
-z key=……pem; SVRk
(以下略)
みたいな感じで。
詳細なレポートありがとうございます。
「session id context uninitialized」と言ってるので、sid_ctx オプションで session id context を設定してみてもらえますか?
例えば、
-dd
-z tls1
-z sid_ctx=test
-z key=……pem; SVRk
(以下略)
みたいな感じで。
ご返信ありがとうございます。
> sid_ctx オプションで session id context を設定
> session id context uninitialized
> context id is not generated if ssl server uses optional client verification.
https://rt.cpan.org/Public/Bug/Display.html?id=76053
確かに、-z sid_ctx=(長いランダム英数字) をサーバ側に設定したところ
Firefoxでも正常に接続できました。
まぁ、クライアントにもstoneを入れたことで、上記以外の通信(*)にもstoneを
使用しているため、sid_ctxは無くても大丈夫?かもしれないです。
* SSH,HTTP,その他を、stoneで「クライアント認証TLS」で送受信できるのは便利です。
Wi-fiが簡単にクラックできる今、通信をクラ認証のみにした(サーバ側Wifi、stone以外全部遮断)ことで、
証明書なしでの通信が一切できないようになりました。
(TLS1.2ではないですが、まぁ大丈夫と思いたい)
話がそれますが、「stone for Android」をF-Droidで公開できないか、Fdroidの方に
確認中です。(Googleを一切利用しないため、FDroidは便利です)
https://gitlab.com/fdroid/fdroiddata/issues/438
Androidでも上記のクラ認証ができれば、いろいろ便利になりそうです。
Androidで試してみたくなり、apkpureからAPKを拾って使ってみました。(1.0.3)
3点だけ気になりました:
1. まだRunしてないのに、「右上」→「Exit」→「Yes」をタップすると、裏でターミナルが表示あるいは起動したままになる。
(ターミナルアプリを入れてない人はどういった挙動になるのかは知りませんが)
2. Historyと、最初の入力欄にある「-dd http://www.gcd.org:80 …」を削除して、Exit→再度アプリを起動すると復活している。
3. ポート番号(a1:a2 b1:b2のb2)を1024以下にするとエラー13になる。
非rootでは当たり前のことですが、非root端末だと
「This device is not rooted. Change your source port to over 1024」みたいな表示だと気がつきやすいです。
(DSADブログのほうにAndroidの紹介があったので、そちらに書き込もうとしたら拒否された)
それら以外にはありません。Windows版stoneのように、安定して使えています。
https://i.imgur.com/X4DGafs.jpg
Android[local->Orbot->Stone:]===Wifi(WPA2)===Server[:Stone->Proxy]->VPN->Internet
ところで、Windows版のビルドには、やはりVisualStudioは必須ですか?
Code::Blocks(+GNU GCC Compiler)でビルドしようとしたところ、hファイルがなさ過ぎて無理でした。
DSASブログは、海外のIPアドレスからのコメント書き込みを拒否する設定になっていたそうです。先ほど設定を変更してもらったので、いまは書き込めるのではないかと思います。
MinGW でビルドできるはずですが、現時点での推奨は Visual C++ ですね。無償ですし。
TLS1.2をサポートするためには、OpenSSLのバージョンアップとリビルドが必要でしょうか。
※ ちなみに、Android 4.0.xでTLS1.2でのデータ送受信を狙っています。
なにぶん、ネットワーク系の技術が足りていないもので、
どこから手をつけていのやら途方に暮れています。
最近までLANアクセス等のためにL2TPを使っていたのですが、バッテリーの劣化が激しいのでstoneに切り替えました*。
最高レベルがTLS1.0なのでTLS1.2に対応させたく VisualC++ 2010 Expressでstoneをコンパイル
しようとしたのですが、「regex.h」等がなくコンパイルできませんでした。
もし可能であれば、デバッグできるような.sln一式をWebページに公開いただけないでしょうか?
(仮想PCにVC2010を入れて試しましたが、そう簡単にはコンパイルできなさそうです)
> どこから手をつけていのやら
予想ですが、
Line 9260: if (isserver) opts->meth = TLSv1_server_method();
Line 9261: else opts->meth = TLSv1_client_method();
を「TLSv1_2_method」に変更すると、TLS1.2にできそうな気がします(Cは専門外です)。
ついでに「TLS1.1以下のコードの完全削除 & スリム化」を考えていました。
*
1. Androidに「NoRoot Firewall」をインストール
2. Firewallは、stoneのみを許可して、ほかは拒否。
Android[stone(個人証明書認証)]====TLS1.0===>公開WWWサーバ[stone(復号してlocalhostのPrivoxyへ丸投げ)]⇒インターネット/LAN
CVS レポジトリの最新版 stone.c は TLS1.2 に対応しております。
http://ja.osdn.net/cvs/view/stone/stone/stone.c?view=log
VisualC++ の場合は、
nmake win-svc
などと実行すればビルドできます。この場合、regex.h ではなく pcreposix.h が参照されます。
PCRE は http://www.pcre.org/ からダウンロードできます。
>CVS レポジトリの最新版 stone.c
6ヶ月前からTLS1.2の準備(v2.4)をされていたのですね、気がつきませんでした。
帰ってからコンパイルを試してみます。ありがとうございます。
別件で別ネットワークにstoneを使い始めたのですが、2件問題がありました。
1: “-z cipher” で、以下を試すと、2つとも「5024 error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match」
で起動しませんでした。
“AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS” <—- nginxで使用中
"AES256+EECDH:AES256+EDH:AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS"
今は以下のように「HIGH」を追記して起動していますが、通信時いつも [SSL cipher=AES256-SHA] が選択されます。
2: 今回、なぜか「←」を追加すると、以下のエラーによりクライアントから通信できなくなりました。
3行削除して再度stoneを起動しなおすと通信できます。
re0とre1の文字列の確認、入れ替えを試しましたがどうしても失敗します。
(server side log)
3068 stone 596: accepted TCP 1052 from XXXXXXXX/ssl mode=0
4144 596 TCP 1052: [depth1=/C=XX/O=XXXX/OU=XX/CN=rootca.thisisatestserver.office]
144 596 TCP 1052: SSL_accept lib error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
(証明書作成方法)
以前と同じで、rootCAの公開鍵、秘密鍵を作り、その2つを使って
サーバ用鍵セットと、クライアント用鍵セットを作成しました。
[Windows]
-dd
-z tls1
-z servername=wireless.gw.thisisatestserver.office
-z key=xxxx/device.pri.pem
-z cert=xxxx/device.pub.pem
-z CAfile=xxxx/rootCA.pub.pem
-z cipher="AES256+EECDH:AES256+EDH:HIGH:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS"
-z verify ←
-z re0=”^/C=……$” ←
-z re1=”^/C=……$” ←
-z verbose
127.0.0.1:YYYY 192.168.X.X:X/ssl 192.168.X.Z
[Android]
-dd
-q tls1
-q servername=wireless.gw.thisisatestserver.office
-q key=/xxAndroid-SDcardxx/device.pri.pem
-q cert=/xxAndroid-SDcardxx/device.pub.pem
-q CAfile=/xxAndroid-SDcardxx/rootCA.pub.pem
-q verbose
192.168.X.X:X/ssl 127.0.0.1:ZZZZ
何かヒントをいただけますと幸いです。
何度もすみません。
verify の件、原因が判明しました。
「-q re1=”^/xxxxxxxxxxxx$”」 ← ダブルクオートの記号ミスでした…
(Notepad++で編集していたため、上の記号がダブルクオートに見えてました)
ということで、クライアント・サーバ両方でverifyできるようになりましたが、
1つ気になったことがあるので報告です。
サーバ側設定
-z verify
-z re0=”^/C=…./CN=clientnode0001\.testing….$”
-z re1=…
re0/re1の文字列で、1文字でも間違いがあると(clientnode0001がclientnode001だったり)
クライアントが接続してきたときに
「632 596 TCP 1052: SSL_accept lib error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned」
とサーバ側に表示されます。これだと、クライアントが証明書を返していないと勘違いするかもしれないので
「no certificate returned」の他に「certificate data mismatch(verification failed)」のような
エラーを追加してほしいです。
Windowsでデバッグしているのに、!Windowsの行を参照してエラーが出たり(#define USE_PCRE、#define WINDOWSを追加)
「undefined reference to getnameinfo/freeaddrinfo」があったりで(「#define _WIN32_WINNT 0×501」を一番上の辺りに追加)
コンパイルがいろいろと難しいです。PCRE一式を/includeに入れて、ほとんどのエラーは消えましたが
「undefined reference to _imp__regexec」がなぜか表示されます(regex.hロード済で)。
1つ変更点があるとすると
> stone.c|4523|warning: incompatible implicit declaration of built-in function ‘rindex’
p = rindex(buf, ‘:’); <—
index/rindexは非推奨とのことで、「strrchr(buf, ':');」に書き換えるとwarningは消えました。
cipherを指定してもAES-SHAが指定される件について、
https://ja.osdn.net/ticket/browse.php?group_id=156&tid=34027 にPFS対応(Perfect forward security)のパッチがあるようなので
セキュリティのためにも、ぜひマージしていただきたいです。
コメントが複数になりましたので、非表示でも、まとめて頂いてもかまいません。
Unknown node:serv XX.XX.XX.XX:XXXX len=16 err=-3 errno=0
上記エラーはどのような意味ですか?
また、上記エラーが頻発するとstoneデーモンが落ちます。
「err=-3」は、EAI_AGAIN です。つまり逆引きが (一時的に) できなかったということですね。DNS に「XX.XX.XX.XX:XXXX」の逆引きが登録されていないのであれば、正常な動作です。
ただし頻発すると落ちるというのは問題なので、動作環境 (OS のバージョンなど) と落ちた時点のスタックトレース等をご連絡頂ければ調査したいと思います。
とりあえずの対処法としては、stone に -n オプションを指定すれば、逆引きを抑制できます。
TLS1.3の仕様が確定されてます。
OpenVPNもいずれTLS1.3をサポートするようですし、もしstoneを更新されるのであれば1.3もサポートしてほしいです。SSL1.xとTLS1.0は、流石に古い・脆弱性ありなので削除していいと思います。
スマホで、未だにVPN代わりにstoneを使ってます。OpenVPN、Orbotなどはセッション張ったままでバッテリーが削られるのに対し、stoneはパケット単体で送受信できるのでバッテリーの持ちがいいです。
Android(Stone for Android) –TLS暗号化–> 自宅鯖(stoneと証明書認証の組み合わせ) —> ネット
外出先でも日本のIP(自宅鯖)でネットができるという利点付き。