Android は NanoHttpd を使用してアプリで https サーバーを構築します (2)

1.シーン

需要とセキュリティの考慮により、NanoHttpd を使用して構築された http サーバーを以前のドキュメントの https プロトコルに変更する必要がありますが、正式な CA 機関によって発行されたデジタル証明書をテストする方法がないため、自己のプロトコルを使用します。 https サーバーを検証する署名付きメソッド。

ソースコードを見ると、NanoHttpd は Https をサポートし、HTTPS (SSL) をサポートしています。

 2. Https プロトコルに関する基礎知識

        HTTPS の基本的な動作原理は、多くの開発者にとって非常によく知られている必要があります. HTTP の一般的なステレオタイプのエッセイの説明を思い出してください:

1. クライアント (ブラウザ) が HTTPS URL にアクセスする;
2. サーバーが HTTPS で使用される CA 証明書を返す;
3. クライアント (ブラウザ) が CA 証明書が正当な証明書であるかどうかを検証する;
4. 検証に合格した後、証明書は合法であり、乱数の文字列であり、公開鍵 (証明書で提供される) を使用して暗号化します;
5. 公開鍵によって暗号化された乱数をサーバーに送信します;
6. サーバーは暗号文を取得し、秘密鍵を取得し、乱数を取得する (暗号化された公開鍵、暗号化された秘密鍵、およびその逆)
7. サーバーは、ブラウザーに送信するコンテンツを乱数で暗号化し、クライアント (ブラウザー) に送信します。 ;
8. このとき、クライアント (ブラウザ) は乱数を使用してデータを復号化し、サーバーの実際の送信内容を取得します。
 

        それでは本題に戻りましょう. まず CA 証明書とは何かを知る必要があります. CA は Certificate Authority の略です. 次に, CA 証明書は認証局が発行するデジタル証明書です. なぜこの認証局が必要なのか.証明書を発行しますか?? 第三者の保証機関と理解することができます. この保証機関は、クライアントとサーバー間の通信のセキュリティを保証します. このように、証明書が保証機関によって保証されていることをクライアントが見る限り、.サーバーを認識し、サーバーと通信します. それは後続の対話を実行します. そうしないと、他の証明書は無効になり、それ以上の対話は実行されません.

        次に、この証明書は正当性を証明するために使用されるだけでなく、公開鍵も含まれています。これにはいくつかの暗号関連の知識ポイントが含まれます. 非対称暗号化の概念について少し知る必要があります. 非対称暗号化がある場合、対称暗号化があるに違いないと推測できます. 対称暗号化は、暗号化と復号化に同じキーを使用することです. . 非対称暗号化は、公開鍵と秘密鍵の 2 つの鍵を使用して暗号化と復号化を行い、公開鍵はクライアントに公開され、秘密鍵は漏えいを防ぐためにローカルに保存されるため、より安全になります。この公開鍵を使用して暗号化されたデータは秘密鍵で復号化でき、その逆も同様です. 上記の HTTPS 接続プロセスでは、手順 1 ~ 6 で非対称暗号化と復号化のプロセスが行われ、次のようになります。 , 乱数は、通信のための対称暗号化キーとして使用されます. 一方で, これは通信効率を向上させるためであり、さらに重要なことに, セキュリティを確保するために, 元の公開鍵と秘密鍵がまだ使用されている場合は秘密鍵が使用されるため.サーバー側で暗号化するため、公開鍵を持つクライアントがサーバーから送信された情報を傍受して復号化できる限り、明らかにこれは不可能です。

        概念を理解した後、自己署名証明書の概念は、CA 組織として自分自身に証明書を発行し、クライアントにこの証明書を信頼させる方法を見つけることです (一般的なデフォルトの方法は、システムが信頼できる証明書のリスト, その中にはいくつかの CA 組織のルート証明書があります), そして証明書には私たちの公開鍵が含まれています. クライアントはこの公開鍵を使ってデータを暗号化し, データを送信します. サーバーはそれを受け取り,秘密鍵を使用してロックを解除し、暗号化と復号化の通信プロセス全体を完了します。次に、このような通信プロセスをシミュレートします。

3. 自己署名証明書プロセス

        KeyStore Explorer を使用してBKS-V1キーストアを作成し、「keystore.bks」として Android の raw フォルダーに保存します。または、次のコードを使用してキーストア ファイルを作成し、それをキーストア エクスプローラーで開き、そのタイプを BKS-V1 に変更することもできます。

キーストア エクスプローラー - ダウンロード (keystore-explorer.org)

Windows が cmd ターミナルを開き、次のコマンドを貼り付けます。ここで、-storepass の後ろの値を独自の storepass に変更できます。

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

上記のコマンドを理解するのは難しいことではありません, つまり, キーファイルの生成場所, key alias,key passwordおよび有効性を設定します. Enterを押した後, プロンプトに従って関連情報を入力し続ける必要があります. 情報を入力した後key store、次に、 Y 確認情報を入力します。上記の storepass は myKeyStorePass、エイリアスは自己署名、有効期間は 360 日、keystore.bks は C ドライブの現在のユーザー ディレクトリ (C:\Users\sunbinkang) に保存されます。

次に、上記でインストールしたキーストア リソース マネージャー KeyStore Explorerを使用して keystore.bks ファイルを見つけて開き、開くときに上記の storepass パスワードを入力します (ps: 私は長い間ここで立ち往生していました。storepass パスワードを忘れずに入力してください。キーパスパスワードではありません)、開いた後、[ツール] ---> [キーストアの種類を変更] ---> [BKS-V1] を見つけて保存します。

4. Android プロジェクトで自己署名証明書を使用する

        前のステップで生成された keystore.bks を変換した後、ファイルをプロジェクトの main->res->raw ディレクトリに置きます.そのようなフォルダーがない場合は、新しいフォルダーを作成してください;

次のコードを HttpServer.kt ファイルの二次構造に追加します。

    //服务器信任的客户端证书
    constructor(context: Context, hostname: String?, port: Int) : this(hostname, port) {
        //从文件中拿到流对象
        val keystoreStream: InputStream =
            context.resources.openRawResource(R.raw.keystore)
        //拿到keystore对象
        val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
        //keystore加载流对象,并把storepass参数传入
        keyStore.load(keystoreStream, "myKeyStorePass".toCharArray())
        val keyManagerFactory =
            KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
        //这里的第二个参数就是密钥密码,keypass
        keyManagerFactory.init(keyStore, "*******".toCharArray())
        //调用 NanoHttpd的makeSecure()方法
        makeSecure(makeSSLSocketFactory(keyStore, keyManagerFactory), null)
    }

5. Postman またはブラウザが https 要求の検証を開始します

最初の図は、自己署名の理由によるもので、ユーザーは証明書を手動で信頼する必要があります。図 2 は、HTTPS get 要求が開始され、要求が成功したことを示しています。

これまでのところ、Nanohttpd の httpserver に基づいて https プロトコルをサポートしてきました。

最後に、mainactivity のコードを添付します。

class MainActivity : AppCompatActivity() {
    var mHttpServer: HttpServer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mHttpServer = HttpServer(MainActivity@ this, HTTP_IP, HTTP_PORT)
        //三种启动方式都行
//        mHttpServer.start()
//        mHttpServer.start(NanoHTTPD.SOCKET_READ_TIMEOUT)
        mHttpServer?.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false)
    }

    override fun onDestroy() {
        super.onDestroy()
        mHttpServer?.stop()//停止
    }
}

プロジェクト コード アドレス: GitHub - sunbinkang/NanoHttpdDemo: Android アプリは nanohttpd を使用して http サーバーを構築し、https プロトコルをサポートします

証明書にはパスワードがあり、自分の証明書のパスワードはコードで **** でマークされているため、プロジェクトの未加工ファイルの証明書を自分で生成する必要があることに注意してください。 keystore.bks 役に立たない。したがって、実行したい場合は、自分で生成する必要があります。特定の世代の手順を参照し、わからない場合は質問してください。

おすすめ

転載: blog.csdn.net/sunbinkang/article/details/124306367