マネーサーバのクライアント(SIM)認証

マネーサーバのクライアント(SIM)認証

Iseki Fumikazu發表於
Number of replies: 2

現在 JOG のマネーサーバのクライアント(SIM)認証が有効になっていません.

有効にすると

System.Security.Cryptography.X509Certificates.X509Certificate2.GetNameInfo()

System.InvalidOperationException: Operation is not valid due to the current state of the object.

のエラーが起きます.

同じOpenSimのシステム(バージョン)を使用している TUISの教育グリッドでは発生しないため,インストールしている mono のバージョンのせいだと思われます.

TUISの教育グリッド: Mono JIT compiler version 4.4.2
Japan Open Grid:Mono JIT compiler version 5.20.1.27

 

----------------------------
12:18:44 - [BASE HTTP SERVER]: HttpServer.HttpListener had an exception System.InvalidOperationException: Operation is not valid due to the current state of the object.
  at Mono.Btls.X509CertificateImplBtls.MustFallback () [0x00008] in <064e47c6af704f099a207445840d0da9>:0
  at Mono.Btls.X509CertificateImplBtls.get_FallbackImpl () [0x00000] in <064e47c6af704f099a207445840d0da9>:0
  at Mono.Btls.X509CertificateImplBtls.GetNameInfo (System.Security.Cryptography.X509Certificates.X509NameType nameType, System.Boolean forIssuer) [0x00000] in <064e47c6af704f099a207445840d0da9>:0
  at System.Security.Cryptography.X509Certificates.X509Certificate2.GetNameInfo (System.Security.Cryptography.X509Certificates.X509NameType nameType, System.Boolean forIssuer) [0x00006] in <064e47c6af704f099a207445840d0da9>:0
  at HttpServer.HttpClientContext..ctor (System.Boolean secured, System.Net.IPEndPoint remoteEndPoint, System.IO.Stream stream, HttpServer.IRequestParserFactory parserFactory, System.Int32 bufferSize, System.Net.Sockets.Socket sock) [0x00232] in <4d43db97334f4d22a50a9fa8d175062a>:0
  at HttpServer.HttpContextFactory.CreateNewContext (System.Boolean isSecured, System.Net.IPEndPoint endPoint, System.IO.Stream stream, System.Net.Sockets.Socket sock) [0x00000] in <4d43db97334f4d22a50a9fa8d175062a>:0
  at HttpServer.HttpContextFactory.CreateContext (System.Boolean isSecured, System.Net.IPEndPoint endPoint, System.IO.Stream stream, System.Net.Sockets.Socket sock) [0x00000] in <4d43db97334f4d22a50a9fa8d175062a>:0
  at HttpServer.HttpContextFactory.CreateSecureContext (System.Net.Sockets.Socket socket, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Authentication.SslProtocols protocol, System.Net.Security.RemoteCertificateValidationCallback _clientCallback) [0x0007d] in <4d43db97334f4d22a50a9fa8d175062a>:0
  at HttpServer.HttpListenerBase.OnAccept (System.IAsyncResult ar) [0x00098] in <4d43db97334f4d22a50a9fa8d175062a>:0

In reply to Iseki Fumikazu

Re: マネーサーバのクライアント(SIM)認証

Iseki Fumikazu發表於

もう少し考えて,マネーサーバ側で解決方法がない場合は,mono のバージョンを下げます.

In reply to Iseki Fumikazu

Re: マネーサーバのクライアント(SIM)認証

Iseki Fumikazu發表於

メモ:

  1. アバターがログインすると,OSHttpServer.OSHttpListener.OnAccept() がトリガーされる.
    • OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpListener.cs 内の関数.
    • 途中で CreateSecureContext() を呼ぶ.
  2. CreateSecureContext()
    • OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpContextFactory.cs 内の関数.
    • この時,コールバック関数へのポインタが渡され,この関数内で実行される.
    • 最後に CreateContext(true, remoteEndPoint, sslStream, socket) を呼ぶ.
  3. CreateContext(true, remoteEndPoint, sslStream, socket)
    • OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs 内の関数.
    • この中で,SSLCommonName = _cert2.GetNameInfo(X509NameType.SimpleName, false); が実行される.
      • 本来ならば,Comon Name が返ってくる筈.
      • mono のバージョンによって _cert2 の生成が上手く行かず,GetNameInfo() でエラーを起こす.
         

解決方法:対症療法だが マネーサーバ用にパッチを当てる.(クライアントのSIMでは不要)

diff -Nur OpenSim-/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs
--- OpenSim-/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs 2020-09-01 22:37:02.330024299 +0900
+++ OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs  2020-09-04 11:42:17.653235008 +0900
@@ -133,8 +133,12 @@
                 if (_cert1 != null)
                 {
                     X509Certificate2 _cert2 = new X509Certificate2(_cert1);
-                    if (_cert2 != null)
+                    if (_cert2.Verify()) {
                         SSLCommonName = _cert2.GetNameInfo(X509NameType.SimpleName, false);
+                    }
+                    else {
+                        SSLCommonName = "unknownName";
+                    }
                 }
             }