この Topic では、HarmonyOS ネイティブネットワークライブラリ、Remote Communication Kit (RCP)、および ArkWeb (WebView) で DNS-over-HTTPS (DoH) を使用する方法について説明します。
1. はじめに
HarmonyOS プラットフォームでは、HarmonyOS software development kit (SDK) を使用して接続することをお勧めします。詳細については、「HarmonyOS SDK マニュアル」または「」をご参照ください。SDK をインポートできない場合は、DoH を使用して接続できます。この Topic では、HarmonyOS の次のネットワークライブラリとコンポーネントで DoH を使用して接続する方法について説明します。
HarmonyOS ネットワークコンポーネントは、1 つの DoH リンクのみをサポートします。サービスの安定性を向上させるには、ローカル DNS へのフォールバックを実装します。
Network Kit および RCP ライブラリは、ローカル DNS への自動フォールバックをサポートしていません。アプリケーションでフォールバックを実装する必要があります。例については、サンプルコードをご参照ください。
ArkWeb では、
<a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-webview-V5#securednsmode10" id="1b0b1b228b7jm">SecureDnsMode</a>をAUTOに設定することで、ローカル DNS への自動フォールバックを有効にできます。
Network Kit および RCP の DoH 構成は、
<a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-net-connection-V5#connectionaddcustomdnsrule11-1" id="424d8cdeddks7">addCustomDnsRule</a>を使用して設定されたカスタム名前解決ルールに影響されます。<a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-net-connection-V5#connectionaddcustomdnsrule11-1" id="4c3da21d56ymi">addCustomDnsRule</a>を使用して特定のドメイン名の名前解決を構成する場合、それらのドメイン名は DoH を使用して解決されません。
2. 前提条件
HarmonyOS のネットワークライブラリまたはコンポーネントに DoH を使用して接続する前に、DoH サービスを構成していることを確認してください。
3. Network Kit (httpRequest) を使用した DoH への接続
Network Kit を使用して、http.request(options: <a href="https://developer.huawei.com/consumer/en/doc/harmonyos-references/js-apis-http#httprequestoptions" id="fa498210ee5q6">http.RequestOptions</a>) の options.dnsOverHttps: string パラメーターを DoH エンドポイントに設定することで、単一のリクエストに対して DNS-over-HTTPS (DoH) を有効にできます。この操作はグローバルセッションを変更しません。次のサンプルコードに例を示します。
import http from '@ohos.net.http';
const httpRequest: http.HttpRequest = http.createHttp();
// これを DoH URL に置き換えます
const DOH_ENDPOINT = 'https://xxxxx.aliyunhttpdns.com/dns-query';
const isDoHFailure = (err: ErrorDetails): boolean => {
const code = String(err.code ?? '');
const msg = String(err.message ?? '');
return /(couldn'?t\s+resolve\s+host\s+name|resolve\s+host\s+name|dns|resolve|name\s*not\s*resolved|EAI_AGAIN)/i.test(msg) || /DNS/i.test(code);
};
httpRequest.request(this.urlInput, {
method: http.RequestMethod.GET,
connectTimeout: 3000,
readTimeout: 3000,
dnsOverHttps: DOH_ENDPOINT,
}).then((res: http.HttpResponse) => {
console.log('DoH リクエスト成功:', res);
}).catch((err: ErrorDetails) => {
if (isDoHFailure(err)) {
console.error('DoH リクエストエラー、ローカル DNS にフォールバックします:', err);
httpRequest.request(this.urlInput, {
method: http.RequestMethod.GET,
connectTimeout: 3000,
readTimeout: 3000,
}).then((fallbackRes: http.HttpResponse) => {
console.log('フォールバックリクエスト成功:', fallbackRes);
}).catch((fallbackErr: ErrorDetails) => {
console.error('フォールバックリクエストエラー:', fallbackErr);
});
} else {
console.error('リクエストエラー:', err);
}
});4. Remote Communication Kit (RCP) を使用した DoH への接続
RCP ネットワークライブラリは、グローバルな Session と個別の Request の 2 つの粒度レベルで DoH 接続をサポートします。この Topic では、両方の接続タイプについて説明します。
4.1 セッションレベルでの DoH への接続
RCP を使用して、SessionConfiguration.requestConfiguration.dns.<a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/remote-communication-rcp-V5#section13705867403" id="424c1e44d83tg">dnsOverHttps</a> で DoH エンドポイントを指定することで、セッションレベルで DoH を有効にできます。この操作はグローバルセッションを変更しません。次のコードに例を示します。
import { rcp } from '@kit.RemoteCommunicationKit';
import type { BusinessError } from '@ohos.base';
private isDoHFailure(err: BusinessError): boolean {
const code: string = err.code ? String(err.code) : '';
const msg: string = String(err.data);
return /(couldn'?t\s+resolve\s+host\s+name|resolve\s+host\s+name|dns|resolve|name\s*not\s*resolved|EAI_AGAIN)/i.test(msg) || /DNS/i.test(code);
}
async sendRequest() {
try {
const dohConfig: rcp.DnsOverHttpsConfiguration = {
url: 'https://xxxxx.aliyunhttpdns.com/dns-query',
skipCertificatesValidation: false,
};
const dohSession = rcp.createSession({
requestConfiguration: {
dns: { dnsOverHttps: dohConfig },
transfer: { timeout: { connectMs: 3000, transferMs: 8000 } },
},
});
const resp = await dohSession.get(this.urlInput);
console.info('DoH リクエスト成功, status=', resp.statusCode);
console.info('応答:', JSON.stringify(resp));
} catch (err) {
if (this.isDoHFailure(err)) {
console.error('DoH リクエストエラー、ローカル DNS にフォールバックします:', err);
try {
const localSession = rcp.createSession({
requestConfiguration: { transfer: { timeout: { connectMs: 3000, transferMs: 8000 } } },
});
const fb = await localSession.get(this.urlInput);
console.info('フォールバック (ローカル DNS) 成功, status=', fb.statusCode);
console.info('フォールバック応答:', JSON.stringify(fb));
} catch (fallbackErr) {
console.error('フォールバック (ローカル DNS) リクエストエラー:', fallbackErr);
}
} else {
console.error('リクエストエラー (非 DoH):', err);
}
}
}4.2 リクエストレベルでの DoH への接続
request.configuration.dns.<a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/remote-communication-rcp-V5#section9677185417382" id="da462d45103k9">dnsOverHttps</a> を DoH エンドポイントとして指定することで、グローバルセッションを変更せずに、単一の RCP リクエストに対して DoH を有効にできます。サンプルコードは次のとおりです。
import { rcp } from '@kit.RemoteCommunicationKit';
import type { BusinessError } from '@ohos.base';
async sendRequest() {
try {
const dohConfig: rcp.DnsOverHttpsConfiguration = {
url: 'https://xxxxx.aliyunhttpdns.com/dns-query',
skipCertificatesValidation: false,
};
const session = rcp.createSession({
requestConfiguration: {
transfer: { timeout: { connectMs: 3000, transferMs: 8000 } },
},
});
const perReq = new rcp.Request(this.urlInput, 'GET', undefined, undefined, undefined, undefined, {
dns: { dnsOverHttps: dohConfig },
});
const resp = await session.fetch(perReq);
console.info('DoH リクエスト成功, status=', resp.statusCode);
console.info('応答:', JSON.stringify(resp));
} catch (err) {
if (this.isDoHFailure(err)) {
console.error('DoH リクエストエラー、ローカル DNS にフォールバックします:', err);
try {
const localSession = rcp.createSession({
requestConfiguration: { transfer: { timeout: { connectMs: 3000, transferMs: 8000 } } },
});
const fb = await localSession.get(this.urlInput);
console.info('フォールバック (ローカル DNS) 成功, status=', fb.statusCode);
console.info('フォールバック応答:', JSON.stringify(fb));
} catch (fallbackErr) {
console.error('フォールバック (ローカル DNS) リクエストエラー:', fallbackErr);
}
} else {
console.error('リクエストエラー (非 DoH):', err);
}
}
}5. WebView の DoH ポリシー
webview.WebviewController.setHttpDns を使用して DoH URL を指定できます。次のコードに例を示します。
import { webview } from '@kit.ArkWeb';
webview.WebviewController.setHttpDns(webview.SecureDnsMode.AUTO, 'https://xxxxx.aliyunhttpdns.com/dns-query');HarmonyOS ネットワークコンポーネントは、1 つの DNS-over-HTTPS (DoH) リンクのみをサポートします。サービスの安定性を向上させるために、ローカル DNS フォールバックを実装することをお勧めします。ArkWeb では、<a data-init-id="1b0b1b228b7jm" href="https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-webview-V5#securednsmode10" id="cc698912edejc">SecureDnsMode</a> を AUTO に設定して、ローカル DNS への自動フォールバックを有効にできます。
6. まとめ
この Topic では、DNS-over-HTTPS (DoH) 機能を HarmonyOS ネットワークライブラリと統合する方法について説明しました。この統合により、アプリケーションのセキュリティとプライバシー保護が大幅に向上します。構成が完了したら、DoH が正しく機能していることを確認できます。これを行うには、スマートフォンの Wi-Fi ネットワークの DNS サーバを無効なアドレスに設定し、アプリケーションが引き続きリクエストを正常に実行できるかどうかを確認します。