RDAPとは?
WHOIS(ドメインやIPアドレスの所有者を検索するサービス)をドメインやIPアドレス事業者が提供しているが、EUのGDPR(欧州データ一般保護規則に対応できない(検索して表示される項目に住所や担当者名・連絡先などが表示される)ため、それに代わる検索システムとしてRDAPというプロトコルをICANNで策定された。
また、WHOISでは、すべてテキストベースで結果が表示されていたため、人間が見るにはよいが、プログラムで処理するには適していなかった。そのため、RDAPではREST APIで問い合わせを行い、結果をJSON形式で返すように定められている。
通常、自社のサーバ等でRDAPをサービスする機会はほぼない(レジストリ以外では不要)と思われる。
前提ソフトウェアのインストール
RDAPサーバとして、現時点(2019年11月)で、openrdapとreddogのオープンソースソフトウェアが確認されている。
今回はreddogを使用してRADAPサーバの構築を行った。
RDAPサーバはTomcatで動作するため、前提ソフトウェアとして、Apache Tomcat、MySQL(Mariadb)、Apache、openjdk、mysql-connector-javaが必要となる。今回はすべてyumレポジトリよりインストールしている。
$ sudo yum install java-latest-openjdk httpd mariadb mariadb-server mysql-connector-java tomcat
RDAPサーバのインストール
reddogはwar形式で配布されているので、公式サイトより最新版をダウンロードする。
$ cd $CATALINA_HOME/webapps/rdap/
$ wget https://github.com/NICMx/rdap-server/releases/download/v1.4.3/rdap-server-1.4.3.war
$ jar -xvf rdap-server-1.4.3.war
$ rm rdap-server-1.4.3.war
次にサンプルのDAOファイルをダウンロードします。
reddogでは、ビルトインDBやMySQLなどの外部DBなど様々なDAOが利用できます。
$ cd $CATALINA_HOME/webapps/rdap/WEB-INF/lib
$ wget https://github.com/NICMx/releases/raw/master/RedDog/rdap-sample-daa-impl-0.0.2.jar
本来であれば、”$CATALINA_HOME/webapps/rdap/WEB-INF/data-access.properties”にどのDAOを使用するか記載する必要があるのですが、1つしかない場合は、自動的に設定してくれますので、以上で終了です。
$ sudo systemctl start tomcat
Tomcatを起動します。エラーなく起動できていることを確認してください。ブラウザから”http://サーバ名:8080/rdap/”にアクセスすると
が表示されます。
MySQLをデータソースとして使用する
これまではビルトインのデータベースを使用していた。しかし、このままでは使い勝手が悪く他のアプリケーション(例えばドメイン管理用のアプリなど)との連携がしにくくデータの登録・削除・更新もしずらい。そこで、データベースをMySQL(Mariadb)に変更する。
MariaDBのインストールと初期設定(rootユーザのパスワード設定等)は完了しているものとする。
まずは、データベースの初期化(テーブルの作成など)を行う
$ wget https://raw.githubusercontent.com/NICMx/rdap-sql-provider/v1.4.2/src/test/resources/META-INF/sql/Database.sql
$ mysql -u root -p < Database.sql
これで、データベースの作成と初期データ(カントリーコードだけ)の登録がされる。
つぎにJavaから接続するユーザを作成する。
$ mysql -u root -p
mysql > create user 'rdap'@'localhost' identified by 'password';
mysql > grant all on rdap.* to 'rdap'@'localhost' identified by 'password';
つぎにSQL用のDAOをインストールする。
$ cd $CATALINA_HOME/webapps/rdap/WEB-INF/lib/
$ wget https://github.com/NICMx/rdap-sql-provider/releases/download/v1.4.2/rdap-sql-provider-1.4.2.jar
$ rm rdap-sample-daa-impl-0.0.2.jar
なお、先ほど使ったdemo用のDAOは消しておきます。
次にResourceの設定を$CATALINA_HOME/webapps/rdap/META-INF/context.xmlに記述します。
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/rdap">
<Resource name="jdbc/rdap"
type="javax.sql.DataSource"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/rdap"
username="rdap"
password="パスワード"
validationQuery="select 1" />
</Context>
yumで入ったtomcatはバグがあるらしく
Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
と起動時にエラーが発生し、起動しません。いろいろ調べた結果、エラーで見つからないと言われたfactoryを明示的に指定することに。
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/rdap">
<Resource name="jdbc/rdap"
type="javax.sql.DataSource"
auth="Container"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/rdap"
username="rdap"
password="パスワード"
validationQuery="select 1" />
</Context>
これで起動してもやはりエラーになる。
java.lang.IllegalArgumentException: mx.nic.rdap.db.exception.InitializationException: Trouble loading country codes from the DB.
....
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
よくログをみるとSQLのドライバが読めていないよう。そこで、SQLのドライバをWEB-INF/libにコピー。
$ cp /usr/share/java/mysql-connector-java.jar $CATALINA_HOME/webapps/rdap/WEB-INF/lib/.
これで完了。
なお、DBの中身はカントリーコード以外空白なので、何も値を返しません。