PKIは、世の中の安全を守っています。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

PKIを構成するOCSPを利用する目的はどれか。

  1. 誤って破棄してしまった秘密鍵の再発行処理の進捗状況を問い合わせる。
  2. ディジタル証明書から生成した鍵情報の交換がOCSPクライアントとレスポンダの間で失敗した際,認証状態を確認する。
  3. ディジタル証明書の失効情報を問い合わせる。
  4. 有効期限の切れたディジタル証明書の更新処理の進捗状況を確認する。

平成31年春期問2 OCSPを利用する目的はどれか|情報処理安全確保支援士.com

OCSPは、デジタル証明書をCRLを突き合わせて有効かを確認するためのプロトコルです。

ponsuke-tarou.hatenablog.com

PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。

PKIとは、公開鍵暗号を正しく発行し配布するシステム。証明局発行の鍵が含まれた証明書をリボジトリで集中管理・配布する。
PKIとは - 意味の解説|ITトレンドのIT用語集

公開鍵暗号技術と電子署名を使って、インターネット上で安全な通信ができるようにするための環境のことを言います。 なりすましやデータの盗聴や改竄を防ぐためのインフラとして近年注目が高まっています。
インターネット用語1分解説~PKIとは~ - JPNIC

データの暗号化とデジタル署名によってPKIは「守秘性」、「完全性」、「認証」、「否認防止」といったセキュリティサービスを提供します。 これらのセキュリティサービスによって、自分が知らぬ間に情報を書き換えられるような事態や、機密情報が盗聴されるといった脅威を防ぐことできます。 そしてPKIとビジネスで利用される様々なアプリケーションを組みあわせることにより、そのアプリケーションに対してセキュリティインフラを提供することができます。
PKIとは

暗号化技術はいろいろあります。

ponsuke-tarou.hatenablog.com

電子署名で、送信者が送ったデータの完全性を保証します。

ponsuke-tarou.hatenablog.com

送信者の公開鍵で電子署名を復号しますが、公開鍵が本当に送信者のものかわかりません。

https://www.ipa.go.jp/security/pki/images/image020.png
IPA PKI 概要 3.1.1 公開鍵配布時の認証

公開鍵の持ち主を確認するには2つの方法があります。

PGPモデルは、公開鍵の持ち主と公開鍵の受領者の両方に信頼された第3者が証明書を公開鍵にくっつけて受領者へ渡す方法です。

個人レベルの信頼関係が必要となり、全体が管理されないため用途は少ないです。

認証局モデルは、第3者機関に公開鍵の持ち主を保証してもらい第3者機関の発行した証明書で公開鍵の正当性を確認します。

この第3者機関を「Trusted Third Party(TTP)」「認証局:Certification Authority(CA)」といいます。

https://www.ipa.go.jp/security/pki/images/image021.png
https://www.ipa.go.jp/security/pki/images/image022.png
IPA PKI 概要 (2) 認証局モデル

https://jp.globalsign.com/images/knowledge/ill_ca01.gif
認証局 (CA:Certification Authority)とは?|GMOグローバルサイン【公式】

ponsuke-tarou.hatenablog.com

認証局モデルでは信用関係の保証が重要です。

  1. 受領したデータが改ざんされていないことを確認するには電子署名を確認します。
  2. 電子署名を複合するには送信者の公開鍵が必要です。
  3. 公開鍵を使うには公開鍵が本物か証明書を確認します。
  4. その証明書が信用できるか確認するには認証局が信頼できるかを確認する必要があります。

https://www.ipa.go.jp/security/pki/images/image050.png
https://www.ipa.go.jp/security/pki/images/image051.png
PIA 5 信用モデル

認証局の信用関係を作る方法には種類があります。

種類 説明
単独 CA モデル 1つの CA が全てのユーザに証明書を発行する方式です。
階層型モデル 複数の CA を階層型(ツリー構造)に構成する方式です。
Web モデル あらかじめクライアントのアプリケーションにルート CA の一覧を埋め込む方式です。Web ブラウザで用いられています。
メッシュモデル 複数の CA を相互認証により接続する方式です。
ブリッジ CA モデル 複数の CA がブリッジ CA を介して接続する方式です。

https://www.ipa.go.jp/security/pki/images/image049.png
PIA 5 信用モデル

f:id:ponsuke_tarou:20180904211807j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

さるがSQL*Plusって何?って思ったのでインストールしてみた。

SQL*Plusは、OracleのDB用のCUIクライアントツールです。

SQL*Plusは、Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツールです。SQL*Plusでは、コマンドライン・ユーザー・インタフェースを使用できます。

また、SQL*Plus Instant Clientもあります。これは、OCI Instant Client対応のプラットフォームで使用できるスタンドアロンコマンドライン・インタフェースです。SQL*Plus Instant Clientは使用可能なすべてのOracle Databaseに接続されますが、専用のOracle Databaseをインストールする必要はありません。
SQL*Plusのクイック・スタート

SQL*Plus とは SQL を実行するためのインターフェイスユーティリティである。
インスタンスの起動とマニュアル操作によるインタラクティブSQL の実行が主であるが shell などのスクリプト言語と サイレントモード を併用することで簡単なバッチ処理にも使用できる(※)。
www.shift-the-oracle.com

sqlplusはoracleに対して処理を指示するための最も基本的なCUISQLクライアントツールです。 実質oracle databaseがインストールされている環境にはほぼすべてsqlplusもインストールされているため以下のような様々な用途で使用されています。
WalkingAlone sqlplusとは

e-words.jp

何となく分かるようなわからないのでインストールします。

インストールしてみた。

  • インストールする環境:Windows10 Pro 64bit
1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
2. ダウンロードしたものをすべて解凍して1つのフォルダにまとめます。
  • 解凍したファイルの中身の一部
    • sqlplus.exe : SQL*Plus実行可能ファイル
    • orasqlplusicXX.dll : SQL*Plusデータ共有ライブラリ
    • oci.dll : クライアント・コード・ライブラリ
    • oraociicusXX.dll : OCI Instant Clientデータ共有ライブラリ(英語のみ)
    • orannzsbbXX.dll : セキュリティ・ライブラリ
3. 解凍したフォルダを `C:\app\oracle\instantclient_xx_x` に配置します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ find /c/app/oracle/ -type d
/c/app/oracle/
/c/app/oracle/instantclient_18_3
/c/app/oracle/instantclient_18_3/help
/c/app/oracle/instantclient_18_3/help/ja
/c/app/oracle/instantclient_18_3/help/ja/img
/c/app/oracle/instantclient_18_3/help/ja/img_text
/c/app/oracle/instantclient_18_3/help/us
/c/app/oracle/instantclient_18_3/help/us/img
/c/app/oracle/instantclient_18_3/help/us/img_text
/c/app/oracle/instantclient_18_3/sdk
/c/app/oracle/instantclient_18_3/sdk/admin
/c/app/oracle/instantclient_18_3/sdk/demo
/c/app/oracle/instantclient_18_3/sdk/include
/c/app/oracle/instantclient_18_3/sdk/lib
/c/app/oracle/instantclient_18_3/sdk/lib/bc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc
/c/app/oracle/instantclient_18_3/sdk/lib/msvc/vc14
/c/app/oracle/instantclient_18_3/vc14
4. Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ printenv | grep -i oracle
SQL_PLUS=C:\app\oracle\instantclient_18_3 # 何のパスかすぐわからなくなるので環境変数を1つ作ってそれをPATHに設定しました。
PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>
ORIGINAL_PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>

f:id:ponsuke_tarou:20180905001008p:plain

5. ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。

SQL*Plusの環境変数

# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
TNS_ADMIN=C:\app\oracle\instantclient_18_3
NLS_LANG=Japanese_Japan.AL32UTF8
6. ORACLE ODBCドライバをインストールします。

管理者権限でプロンプトやGitBashなどを起動します。

# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
$ cd $SQL_PLUS # 作った環境変数です。
$ odbc_install JA
Oracle ODBC Driver is installed successfully.

qiita.com

7. SQL*Plusを起動してみます。
$ sqlplus

SQL*Plus: Release 18.0.0.0.0 - Production on 水 95 00:50:15 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

ユーザー名を入力してください:

バージョン違いの実行記録

Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit

  1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
    • instantclient-basic-windows.x64-12.2.0.1.0.zip
    • instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
    • instantclient-sdk-windows.x64-12.2.0.1.0.zip
    • instantclient-jdbc-windows.x64-12.2.0.1.0.zip
    • instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。
$ cd /c/apps/oracle

$ unzip ~/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/
  inflating: instantclient_12_2/uidrvci.sym
  inflating: instantclient_12_2/oci.sym
  inflating: instantclient_12_2/oraocci12d.sym
  inflating: instantclient_12_2/oraons.dll
  inflating: instantclient_12_2/genezi.sym
  inflating: instantclient_12_2/ociw32.dll
  inflating: instantclient_12_2/oraocci12d.dll
  inflating: instantclient_12_2/oci.dll
  inflating: instantclient_12_2/ociw32.sym
  inflating: instantclient_12_2/adrci.exe
  inflating: instantclient_12_2/oramysql12.sym
  inflating: instantclient_12_2/adrci.sym
  inflating: instantclient_12_2/xstreams.jar
  inflating: instantclient_12_2/oraociei12.dll
  inflating: instantclient_12_2/ocijdbc12.dll
  inflating: instantclient_12_2/orasql12.sym
  inflating: instantclient_12_2/oraocci12.sym
  inflating: instantclient_12_2/orannzsbb12.dll
  inflating: instantclient_12_2/ocijdbc12.sym
  inflating: instantclient_12_2/oraociei12.sym
  inflating: instantclient_12_2/genezi.exe
  inflating: instantclient_12_2/ojdbc8.jar
  inflating: instantclient_12_2/orannzsbb12.sym
  inflating: instantclient_12_2/uidrvci.exe
  inflating: instantclient_12_2/oraocci12.dll
   creating: instantclient_12_2/vc14/
  inflating: instantclient_12_2/vc14/oraocci12d.sym
  inflating: instantclient_12_2/vc14/oraocci12d.dll
  inflating: instantclient_12_2/vc14/oraocci12.dll
  inflating: instantclient_12_2/vc14/oraocci12.sym
  inflating: instantclient_12_2/orasql12.dll
  inflating: instantclient_12_2/oramysql12.dll
  inflating: instantclient_12_2/BASIC_README

$ unzip ~/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/
  inflating: instantclient_12_2/sqlplus.exe
  inflating: instantclient_12_2/SQLPLUS_README
  inflating: instantclient_12_2/glogin.sql
  inflating: instantclient_12_2/orasqlplusic12.dll
  inflating: instantclient_12_2/sqlplus.sym

$ unzip ~/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip
   creating: instantclient_12_2/sdk/
   creating: instantclient_12_2/sdk/include/
  inflating: instantclient_12_2/sdk/include/oci8dp.h
  inflating: instantclient_12_2/sdk/include/occiCommon.h
  inflating: instantclient_12_2/sdk/include/occiControl.h
  inflating: instantclient_12_2/sdk/include/oci1.h
  inflating: instantclient_12_2/sdk/include/ociap.h
  inflating: instantclient_12_2/sdk/include/orl.h
  inflating: instantclient_12_2/sdk/include/oratypes.h
  inflating: instantclient_12_2/sdk/include/nzt.h
  inflating: instantclient_12_2/sdk/include/xa.h
  inflating: instantclient_12_2/sdk/include/odci.h
  inflating: instantclient_12_2/sdk/include/occi.h
  inflating: instantclient_12_2/sdk/include/ociapr.h
  inflating: instantclient_12_2/sdk/include/ldap.h
  inflating: instantclient_12_2/sdk/include/ocixstream.h
  inflating: instantclient_12_2/sdk/include/ocixmldb.h
  inflating: instantclient_12_2/sdk/include/oro.h
  inflating: instantclient_12_2/sdk/include/ocixml.h
  inflating: instantclient_12_2/sdk/include/oci.h
  inflating: instantclient_12_2/sdk/include/occiAQ.h
  inflating: instantclient_12_2/sdk/include/ocidef.h
  inflating: instantclient_12_2/sdk/include/ociextp.h
  inflating: instantclient_12_2/sdk/include/orid.h
  inflating: instantclient_12_2/sdk/include/ort.h
  inflating: instantclient_12_2/sdk/include/ocidem.h
  inflating: instantclient_12_2/sdk/include/ocikpr.h
  inflating: instantclient_12_2/sdk/include/occiObjects.h
  inflating: instantclient_12_2/sdk/include/ocidfn.h
  inflating: instantclient_12_2/sdk/include/ori.h
  inflating: instantclient_12_2/sdk/include/occiData.h
  inflating: instantclient_12_2/sdk/include/nzerror.h
   creating: instantclient_12_2/sdk/lib/
   creating: instantclient_12_2/sdk/lib/msvc/
  inflating: instantclient_12_2/sdk/lib/msvc/oci.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oramysql12.lib
   creating: instantclient_12_2/sdk/lib/msvc/vc14/
  inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib
  inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oraocci12.lib
  inflating: instantclient_12_2/sdk/lib/msvc/oraocci12d.lib
  inflating: instantclient_12_2/sdk/lib/msvc/ociw32.lib
   creating: instantclient_12_2/sdk/lib/bc/
  inflating: instantclient_12_2/sdk/lib/bc/oci.lib
 extracting: instantclient_12_2/sdk/ottclasses.zip
  inflating: instantclient_12_2/sdk/SDK_README
  inflating: instantclient_12_2/sdk/ott.bat
   creating: instantclient_12_2/sdk/admin/
  inflating: instantclient_12_2/sdk/admin/oraaccess.xsd
   creating: instantclient_12_2/sdk/demo/
  inflating: instantclient_12_2/sdk/demo/bcmake.bat
  inflating: instantclient_12_2/sdk/demo/make.bat
  inflating: instantclient_12_2/sdk/demo/cdemo81.c
  inflating: instantclient_12_2/sdk/demo/occidemod.sql
  inflating: instantclient_12_2/sdk/demo/occiobj.typ
  inflating: instantclient_12_2/sdk/demo/occidml.cpp
  inflating: instantclient_12_2/sdk/demo/occiobj.cpp
  inflating: instantclient_12_2/sdk/demo/oraaccess.xml
  inflating: instantclient_12_2/sdk/demo/occidemo.sql

$ unzip ~/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip
  inflating: instantclient_12_2/JDBC_README
  inflating: instantclient_12_2/orai18n-mapping.jar
  inflating: instantclient_12_2/heteroxa12.sym
  inflating: instantclient_12_2/heteroxa12.dll
  inflating: instantclient_12_2/orai18n.jar

$ unzip ~/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
Archive:  /c/Users/ponsuke/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip
   creating: instantclient_12_2/help/
   creating: instantclient_12_2/help/ja/
  inflating: instantclient_12_2/help/ja/blafdoc.css
  inflating: instantclient_12_2/help/ja/cpyr.htm
   creating: instantclient_12_2/help/ja/img/
  inflating: instantclient_12_2/help/ja/img/odbcdrvarch.gif
  inflating: instantclient_12_2/help/ja/img/odbcmodel.gif
  inflating: instantclient_12_2/help/ja/img/setup_app.gif
  inflating: instantclient_12_2/help/ja/img/setup_ora.gif
  inflating: instantclient_12_2/help/ja/img/setup_ssmig.gif
  inflating: instantclient_12_2/help/ja/img/setup_work.gif
   creating: instantclient_12_2/help/ja/img_text/
  inflating: instantclient_12_2/help/ja/img_text/odbcdrvarch.htm
  inflating: instantclient_12_2/help/ja/img_text/odbcmodel.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_app.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_ora.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_ssmig.htm
  inflating: instantclient_12_2/help/ja/img_text/setup_work.htm
  inflating: instantclient_12_2/help/ja/map.xml
  inflating: instantclient_12_2/help/ja/oracle.gif
  inflating: instantclient_12_2/help/ja/sqora.htm
  inflating: instantclient_12_2/help/ja/toc.htm
   creating: instantclient_12_2/help/us/
  inflating: instantclient_12_2/help/us/blafdoc.css
  inflating: instantclient_12_2/help/us/cpyr.htm
   creating: instantclient_12_2/help/us/img/
  inflating: instantclient_12_2/help/us/img/odbcdrvarch.gif
  inflating: instantclient_12_2/help/us/img/odbcmodel.gif
  inflating: instantclient_12_2/help/us/img/setup_app.gif
  inflating: instantclient_12_2/help/us/img/setup_ora.gif
  inflating: instantclient_12_2/help/us/img/setup_ssmig.gif
  inflating: instantclient_12_2/help/us/img/setup_work.gif
   creating: instantclient_12_2/help/us/img_text/
  inflating: instantclient_12_2/help/us/img_text/odbcdrvarch.htm
  inflating: instantclient_12_2/help/us/img_text/odbcmodel.htm
  inflating: instantclient_12_2/help/us/img_text/setup_app.htm
  inflating: instantclient_12_2/help/us/img_text/setup_ora.htm
  inflating: instantclient_12_2/help/us/img_text/setup_ssmig.htm
  inflating: instantclient_12_2/help/us/img_text/setup_work.htm
  inflating: instantclient_12_2/help/us/map.xml
  inflating: instantclient_12_2/help/us/oracle.gif
  inflating: instantclient_12_2/help/us/sqora.htm
  inflating: instantclient_12_2/help/us/toc.htm
  inflating: instantclient_12_2/ODBC_IC_Readme_Win.html
  inflating: instantclient_12_2/odbc_install.exe
  inflating: instantclient_12_2/odbc_uninstall.exe
  inflating: instantclient_12_2/sqora32.dll
  inflating: instantclient_12_2/sqoras32.dll
  inflating: instantclient_12_2/sqresja.dll
  inflating: instantclient_12_2/sqresus.dll

$ find /c/apps/oracle/instantclient_12_2/ -type d
/c/apps/oracle/instantclient_12_2/
/c/apps/oracle/instantclient_12_2/help
/c/apps/oracle/instantclient_12_2/help/ja
/c/apps/oracle/instantclient_12_2/help/ja/img
/c/apps/oracle/instantclient_12_2/help/ja/img_text
/c/apps/oracle/instantclient_12_2/help/us
/c/apps/oracle/instantclient_12_2/help/us/img
/c/apps/oracle/instantclient_12_2/help/us/img_text
/c/apps/oracle/instantclient_12_2/sdk
/c/apps/oracle/instantclient_12_2/sdk/admin
/c/apps/oracle/instantclient_12_2/sdk/demo
/c/apps/oracle/instantclient_12_2/sdk/include
/c/apps/oracle/instantclient_12_2/sdk/lib
/c/apps/oracle/instantclient_12_2/sdk/lib/bc
/c/apps/oracle/instantclient_12_2/sdk/lib/msvc
/c/apps/oracle/instantclient_12_2/sdk/lib/msvc/vc14
/c/apps/oracle/instantclient_12_2/vc14

# Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
$ printenv | grep -i oracle
ORACLE_INSTANT_CLIENT=C:\apps\oracle\instantclient_12_2
PATH=<省略>/c/apps/oracle/instantclient_12_2:<省略>
ORIGINAL_PATH=<省略>/c/apps/composer:/c/apps/oracle/instantclient_12_2:<省略>

# ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
$ printenv | grep -e TNS_ADMIN -e NLS_LANG
NLS_LANG=Japanese_Japan.AL32UTF8
TNS_ADMIN=C:\apps\oracle\instantclient_12_2

# ORACLE ODBCドライバをインストールします。
$ cd $ORACLE_INSTANT_CLIENT

$ odbc_install JA
Oracle ODBC Driver is installed successfully.

# SQL*Plusを起動してみます。
$ sqlplus {ユーザ名}/{パスワード}@{データベース}:1521/{サービス名}

SQL*Plus: Release 12.2.0.1.0 Production on 火 128 10:18:28 2020

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

最終正常ログイン時間: 水 1002 2019 11:27:17 +09:00


Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>

Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 32bit

  1. Instant Client for Windows 32-bitからパッケージをダウンロードします。
    • instantclient-basiclite-nt-12.2.0.1.0.zip
    • instantclient-sqlplus-nt-12.2.0.1.0.zip
    • instantclient-sdk-nt-12.2.0.1.0.zip
    • instantclient-jdbc-nt-12.2.0.1.0.zip
    • instantclient-odbc-nt-12.2.0.1.0-2.zip
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。
$ find ~/Downloads/ -name '*.zip' | xargs -n1 unzip -d /c/app/oracle/
Archive:  /c/Users/m-uki/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip
   creating: /c/app/oracle/instantclient_12_2/
  inflating: /c/app/oracle/instantclient_12_2/oraocci12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraociicus12.dll
  inflating: /c/app/oracle/instantclient_12_2/uidrvci.sym
  inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.dll
  inflating: /c/app/oracle/instantclient_12_2/xstreams.jar
  inflating: /c/app/oracle/instantclient_12_2/orasql12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraocci12d.dll
  inflating: /c/app/oracle/instantclient_12_2/genezi.exe
  inflating: /c/app/oracle/instantclient_12_2/ojdbc8.jar
  inflating: /c/app/oracle/instantclient_12_2/adrci.exe
  inflating: /c/app/oracle/instantclient_12_2/BASIC_LITE_README
  inflating: /c/app/oracle/instantclient_12_2/oraocci12d.sym
  inflating: /c/app/oracle/instantclient_12_2/orasql12.dll
  inflating: /c/app/oracle/instantclient_12_2/oraociicus12.sym
  inflating: /c/app/oracle/instantclient_12_2/oraocci12.dll
  inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.sym
  inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.dll
  inflating: /c/app/oracle/instantclient_12_2/ociw32.sym
  inflating: /c/app/oracle/instantclient_12_2/adrci.sym
   creating: /c/app/oracle/instantclient_12_2/vc14/
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.sym
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.dll
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.dll
  inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.sym
  inflating: /c/app/oracle/instantclient_12_2/oci.dll
  inflating: /c/app/oracle/instantclient_12_2/oraons.dll
  inflating: /c/app/oracle/instantclient_12_2/genezi.sym
  inflating: /c/app/oracle/instantclient_12_2/ociw32.dll
  inflating: /c/app/oracle/instantclient_12_2/oci.sym
  inflating: /c/app/oracle/instantclient_12_2/uidrvci.exe
  inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.sym
Archive:  /c/Users/m-uki/Downloads/instantclient-jdbc-nt-12.2.0.1.0.zip
  inflating: /c/app/oracle/instantclient_12_2/orai18n-mapping.jar
  inflating: /c/app/oracle/instantclient_12_2/JDBC_README
  inflating: /c/app/oracle/instantclient_12_2/heteroxa12.dll
  inflating: /c/app/oracle/instantclient_12_2/heteroxa12.sym
  inflating: /c/app/oracle/instantclient_12_2/orai18n.jar
Archive:  /c/Users/m-uki/Downloads/instantclient-odbc-nt-12.2.0.1.0-2.zip
   creating: /c/app/oracle/instantclient_12_2/help/
   creating: /c/app/oracle/instantclient_12_2/help/ja/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/blafdoc.css
  inflating: /c/app/oracle/instantclient_12_2/help/ja/cpyr.htm
   creating: /c/app/oracle/instantclient_12_2/help/ja/img/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcdrvarch.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcmodel.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_app.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ora.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ssmig.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_work.gif
   creating: /c/app/oracle/instantclient_12_2/help/ja/img_text/
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcdrvarch.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcmodel.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_app.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ssmig.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_work.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/map.xml
  inflating: /c/app/oracle/instantclient_12_2/help/ja/oracle.gif
  inflating: /c/app/oracle/instantclient_12_2/help/ja/sqora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/ja/toc.htm
   creating: /c/app/oracle/instantclient_12_2/help/us/
  inflating: /c/app/oracle/instantclient_12_2/help/us/blafdoc.css
  inflating: /c/app/oracle/instantclient_12_2/help/us/cpyr.htm
   creating: /c/app/oracle/instantclient_12_2/help/us/img/
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcdrvarch.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcmodel.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_app.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ora.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ssmig.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_work.gif
   creating: /c/app/oracle/instantclient_12_2/help/us/img_text/
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcdrvarch.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcmodel.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_app.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ssmig.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_work.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/map.xml
  inflating: /c/app/oracle/instantclient_12_2/help/us/oracle.gif
  inflating: /c/app/oracle/instantclient_12_2/help/us/sqora.htm
  inflating: /c/app/oracle/instantclient_12_2/help/us/toc.htm
  inflating: /c/app/oracle/instantclient_12_2/ODBC_IC_Readme_Win.html
  inflating: /c/app/oracle/instantclient_12_2/odbc_install.exe
  inflating: /c/app/oracle/instantclient_12_2/odbc_uninstall.exe
  inflating: /c/app/oracle/instantclient_12_2/sqora32.dll
  inflating: /c/app/oracle/instantclient_12_2/sqoras32.dll
  inflating: /c/app/oracle/instantclient_12_2/sqresja.dll
  inflating: /c/app/oracle/instantclient_12_2/sqresus.dll
Archive:  /c/Users/m-uki/Downloads/instantclient-sdk-nt-12.2.0.1.0.zip
   creating: /c/app/oracle/instantclient_12_2/sdk/
   creating: /c/app/oracle/instantclient_12_2/sdk/admin/
  inflating: /c/app/oracle/instantclient_12_2/sdk/admin/oraaccess.xsd
  inflating: /c/app/oracle/instantclient_12_2/sdk/ott.bat
   creating: /c/app/oracle/instantclient_12_2/sdk/demo/
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidml.cpp
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.typ
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.cpp
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/cdemo81.c
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemod.sql
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/make.bat
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/bcmake.bat
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemo.sql
  inflating: /c/app/oracle/instantclient_12_2/sdk/demo/oraaccess.xml
  inflating: /c/app/oracle/instantclient_12_2/sdk/SDK_README
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oramysql12.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ociw32.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12d.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12.lib
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oci.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/
  inflating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/oci.lib
   creating: /c/app/oracle/instantclient_12_2/sdk/include/
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociapr.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiCommon.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ori.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci8dp.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ldap.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixstream.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/odci.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ort.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occi.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiObjects.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixml.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiData.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci1.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/xa.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oratypes.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzerror.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiControl.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidem.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiAQ.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/oro.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidef.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/orid.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixmldb.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociextp.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzt.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocikpr.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/orl.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidfn.h
  inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociap.h
 extracting: /c/app/oracle/instantclient_12_2/sdk/ottclasses.zip
Archive:  /c/Users/m-uki/Downloads/instantclient-sqlplus-nt-12.2.0.1.0.zip
  inflating: /c/app/oracle/instantclient_12_2/sqlplus.exe
  inflating: /c/app/oracle/instantclient_12_2/SQLPLUS_README
  inflating: /c/app/oracle/instantclient_12_2/glogin.sql
  inflating: /c/app/oracle/instantclient_12_2/orasqlplusic12.dll
  inflating: /c/app/oracle/instantclient_12_2/sqlplus.sym

$ find /c/app/oracle/instantclient_12_2/ -type d
/c/app/oracle/instantclient_12_2/
/c/app/oracle/instantclient_12_2/help
/c/app/oracle/instantclient_12_2/help/ja
/c/app/oracle/instantclient_12_2/help/ja/img
/c/app/oracle/instantclient_12_2/help/ja/img_text
/c/app/oracle/instantclient_12_2/help/us
/c/app/oracle/instantclient_12_2/help/us/img
/c/app/oracle/instantclient_12_2/help/us/img_text
/c/app/oracle/instantclient_12_2/sdk
/c/app/oracle/instantclient_12_2/sdk/admin
/c/app/oracle/instantclient_12_2/sdk/demo
/c/app/oracle/instantclient_12_2/sdk/include
/c/app/oracle/instantclient_12_2/sdk/lib
/c/app/oracle/instantclient_12_2/sdk/lib/bc
/c/app/oracle/instantclient_12_2/sdk/lib/msvc
/c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14
/c/app/oracle/instantclient_12_2/vc14

# Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
$ printenv | grep -i -e instant -e NLS_LANG
NLS_LANG=Japanese_Japan.AL32UTF8
TNS_ADMIN=C:\app\oracle\instantclient_12_2
PATH=<省略>/c/app/oracle/instantclient_12_2

# SQL*Plusを起動してみます。
$ sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on 火 128 21:42:39 2020

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

ユーザー名を入力してください:

Ubuntu18 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit

ponsuke-tarou.hatenablog.com

IPヘッダにあるプロトコル番号でプロトコルを識別できます。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

IPv4において,IPパケットで送られているデータが,ICMPメッセージであることを識別できるヘッダ情報はどれか。

  1. IPヘッダのプロトコル番号
  2. MACヘッダのイーサタイプ値
  3. TCPヘッダのコントロールフラグ
  4. UDPヘッダの宛先ポート番号

平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。

www.weblio.jp

IPv6は、IPv4よりたくさん割り当てられるように128 ビット (16 バイト)で表すIPです。

IPv6アドレスは『128bit』で構成されます。これは2^128通りのアドレス数を保有することになります。
IPv4とIPv6の違いについて | Netassist Blog

ICMPは、IPにおいて制御や調査に用いられるプロトコルです。

  • 正式名称:Internet Control Message Protocol

IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。 ICMPはインターネット層(OSI参照モデルネットワーク層)で動作するプロトコルです。
TCP/IP - ICMPとは

f:id:ponsuke_tarou:20180904164518g:plain
※. ベースの図は、以下のサイト様より拝借いたしました。
TCP/IPをはじめから

ICMP Flood攻撃 と Smurf攻撃は、ICMPのpingを使った攻撃です。

ping の正体は、ICMP の中で一番有名な使われ方である『Ping 要求【Echo Request】』と『Ping 応答【Echo Reply】』で、これは宛先 IP アドレスを 指定して Ping 要求を送り、その宛先まで到達できれば送信元へ Ping 応答を返します。
https://milestone-of-se.nesuke.com/wp-content/uploads/2016/12/icmp-reply.png
【図解】ICMPとは 〜Pingの仕組みやエラー通知によるIP通信の補助〜 | SEの道標

ICMP Flood攻撃は、pingコマンドを用いて大量の要求パケットを発信することによって、攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害します。
  • 英語 : ICMP Flood(洪水)

攻撃対象となるサーバに対してなるべくサイズが大きくなるようにした「ICMP echo request(ping)」を大量に送り続けることで、攻撃対象および攻撃対象が属するネットワークのリソースを枯渇させることを目的とする攻撃です。
https://www.sc-siken.com/kakomon/29_haru/img/18.gif
情報セキュリティスペシャリスト平成29年春期 午前Ⅱ 問18

Smurf攻撃は、IPアドレスを詐称してICMPの応答パケットを大量に送り付けます。

Smurf攻撃(スマーフアタック)は、ネットワークの疎通確認に使用されるICMP echo request(ping)の仕組みを悪用して、相手のコンピュータやネットワークに大量のパケットを送りつける反射型のDoS攻撃です。
攻撃者は、以下の手順で攻撃対象のサービスを妨害します。
①送信元IPアドレスを攻撃対象のコンピュータに偽装したICMP echo requestを攻撃対象が属するネットワークにブロードキャストで大量に送りつける
②ICMP echo requestを受け取ったネットワーク内の端末が一斉に攻撃対象にecho replyパケットで応答する
③大量の応答パケットの発生により攻撃対象のコンピュータおよびネットワークが過負荷状態になり正常なサービスが阻害される
情報セキュリティスペシャリスト平成26年秋期 午前Ⅱ 問12

http://www.k-fix.jp/skill/network/icmp/img/03_01.gif
株式会社K-fix

ICMP Flood攻撃 と Smurf攻撃の違いは、IPアドレスの詐称と目的です。
ICMP Flood攻撃 Smurf攻撃
IPアドレスの詐称 なし リクエストの送信元IPアドレスに自分ではなく標的のアドレスを設定し、
標的の所属するネットワークのブロードキャストアドレス当てに大量に送りつける
目的 標的のアドレスに対して大量のPing 要求を送りつけることで過負荷にさせる 標的のアドレスに対して大量のPing 応答を送りつけることで過負荷にさせる

プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。

プロトコル番号とは、IP(Internet Protocol)で通信する際に、上位層のプロトコルがなんであるかを識別するための番号。IPデータグラムのヘッダ部に8ビットの値として記載されるもので、0から255までのいずれかとなる。
プロトコル番号とは - IT用語辞典 e-Words

プロトコル番号は、上位層のプロトコルを識別するための番号であり、IPヘッダに 8 ビット情報であります。例えばプロトコル番号が 6 の場合はTCP、17 の場合はUDPとなります。プロトコル番号の枠は0~255です。
f:id:ponsuke_tarou:20180904174136p:plain
IPプロトコル番号一覧

プロトコル番号がわかるとプロトコルに何を使っているかがわかります。

IANAのプロトコル番号の一部はこんな感じです。

Decimal Keyword Protocol
1 ICMP Internet Control Message
4 IPv4 IPv4 encapsulation
6 TCP Transmission Control
17 UDP User Datagram
41 IPv6 IPv6 encapsulation
ICMPのプロトコル番号は「1」です。

プロトコル番号は、Internet Protocol(IP)の宛先情報を含めているIPヘッダーに入っています。

https://www.infraexpert.com/studygif/tcpip4.gif
TCP/IP - IPとは

ICMPフレームの部分は、データ本体であるIPペイロードに入っています。

https://www.sc-siken.com/kakomon/30_haru/img/18.gif
平成30年春期問18 ICMPを識別できるヘッダ情報|情報処理安全確保支援士.com

ICMPフレーム部分でタイプ番号とそのコード番号がわかります。

ICMPのタイプ一覧

Type 意味
0 エコー応答(Ping要求 / Echo Request)
3 宛先到達不能
4 始点抑制
5 最適経路への変更指示
8 エコー要求(Ping応答 / Echo Reply)
9 ルータ通知
10 ルータ要求
11 TTL超過によるパケット破棄の報告
12 パケットパラメータにおけるエラー
13 タイムスタンプ
14 タイムスタンプ応答
15 インフォメーション要求
16 インフォメーション応答
17 アドレスマスク要求
18 アドレスマスク応答

f:id:ponsuke_tarou:20180904163142p:plain
TCP/IP通信プログラミング Ver.2 ICMPとPINGコマンド

f:id:ponsuke_tarou:20180904163845p:plain
第12回 TCP/IPプロトコルを支えるICMPメッセージ (1/3):基礎から学ぶWindowsネットワーク - @IT

f:id:ponsuke_tarou:20180904211559j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ

前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

環境

ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。

トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp

トップ画面を作ります。

Controllerを作ります。

f:id:ponsuke_tarou:20180618154305p:plain

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** トップ画面用のController. */
@Controller
public class WelcomeController {
    /**
     * トップ画面の表示リクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる.
     * @return トップ画面のView名.
     */
    @RequestMapping("/")
    public String home() {
        // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。
        return "index";
    }
}

Viewを作成します。

以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。

index.jspを「/src/main/webapp/index.jsp」へ移動します。

以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618160651p:plain

Tomcatを起動してindex.jspを表示してみます。

ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618161841p:plain

index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。

「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。

<html>
<body>
    <h2>Hello World!</h2>
    <ul>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:url」を使用して
         {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています.
         -->
        <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
    </ul>
</body>
</html>
リンクが追加されたことを画面を表示して確認します。

f:id:ponsuke_tarou:20180618163551p:plain

入力画面を作成します。

HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。

package example.app;

import java.io.Serializable;

/**
 * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス.
 */
public class EchoForm implements Serializable {

    /** serialVersionUID. */
    private static final long serialVersionUID = -3147370534900886671L;

    /** 入力値を保持するプロパティ定義. */
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 入力画面のController.
 * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます.
 */
@Controller
@RequestMapping("echo")
public class EchoController {
    /**
     * 表示リスクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます.
     * @param model
     * @return 入力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        // フォームオブジェクトを生成してModelに追加します。
        EchoForm form = new EchoForm();
        // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。
        // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため
        // JSPからは、リクエストスコープのオブジェクトとして参照できます。
        model.addAttribute(form);
        return "echo/input";
    }
}

Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。

<html>
<body>
    <h2>入力画面</h2>
    <!--
     Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします.
     modelAttribute属性にフォームオブジェクトの属性名を指定します.
     「form:form」要素にはmethod/action属性が指定でき、省略すると
     method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります.
     ここのaction属性は、"{App名}/echo"となります.
     -->
    <form:form modelAttribute="echoForm">
        <div>テキストを入力してください :</div>
        <div>
            <!--
             Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します.
             path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます.
             -->
            <form:input path="text" />
        </div>
        <div>
            <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 -->
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>
トップ画面のリンクを押下して入力画面を表示してみます。

f:id:ponsuke_tarou:20180618173629p:plain

入力画面の入力値を出力画面に表示する処理を作成します。

入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(EchoForm form) {
        return "echo/output";
    }

Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。

<html>
<body>
    <h2>出力画面</h2>
    <div>入力したテキストは・・・</div>
    <div>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します.
         「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます.
         --><span><c:out value="${echoForm.text}" /></span></div>
    <div>です。</div>
    <br>
    <div>
        <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. -->
        <a href="<c:url value='/' />">トップ画面へ戻る</a>
    </div>
</body>
</html>
出力画面を表示してみます。

f:id:ponsuke_tarou:20180618180909p:plainf:id:ponsuke_tarou:20180618180917p:plain

Bean Validationを使用した入力チェックを作成します。

Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。

フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。

Hibernate Validationは、前回pom.xmlで設定しました。

    /**
     * 入力値を保持するプロパティ定義.
     * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います.
     * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います.
     */
    @NotEmpty
    @Size(max = 10)
    private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。

Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。

Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     *        <<入力チェック>>
     *        パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます.
     * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します.
     *        BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。
        if (result.hasErrors()) {
            // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。
            return "echo/input";
        }
        return "echo/output";
    }

View(input.jsp)にエラー情報を表示するパーツを追加します。

            <form:input path="text" />
            <!--
             Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します.
             path属性に指定されたプロパティのエラー情報が表示されます。
             -->
            <form:errors path="text" />
        </div>
エラーになったときの入力画面を表示してみます。

f:id:ponsuke_tarou:20180618231043p:plainf:id:ponsuke_tarou:20180618231046p:plainf:id:ponsuke_tarou:20180618231050p:plainf:id:ponsuke_tarou:20180618231059p:plain

この本を読みながらやりました

www.shoeisha.co.jp

SpringプロジェクトにSpring MVCを設定する。

前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。

ponsuke-tarou.hatenablog.com

環境

Spring MVC を設定します。

pom.xmlに依存関係を追加します。

  • pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。

spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
Hibernate(ハイバネート) Validator を指定します。

Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
JCL inplement over SLF4 と Logback を指定します。

Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

ContextLoaderListener のセットアップ

ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com

空のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
}
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <listener>
    <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. -->
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </context-param>
  <context-param>
    <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextConfigLocation</param-name>
    <param-value>example.config.AppConfig</param-value>
  </context-param>

DispatcherServlet のセットアップ

DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。

DispatcherServlet 用のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * DispatcherServlet用のコンフィギュレーションクラス.
 * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる.
 * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの
 * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される.
 */
@Configuration
@EnableWebMvc
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。
}
DispatcherServletクラスをサーブレットコンテナに登録します。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>
      <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
      <param-name>contextClass</param-name>
      <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
    </init-param>
    <init-param>
      <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
      <param-name>contextConfigLocation</param-name>
      <param-value>example.config.WebMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。

CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <!-- encodingパラメータにリクエストパラメータの文字エンコーディングとしてUTF-8を指定します. -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <!--
       forceEncodingパラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します.
       trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります.
       -->
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Viewを判別できるように ViewResolver をセットアップします。

Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。

    /** ViewResolverのセットアップ用メソッド. */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。
        // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
        registry.jsp();
    }

JSPからSpring MVCのtaglibが利用できるように定義を追加します。

以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

次回は、簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

この本を読みながらやっています。

www.shoeisha.co.jp

コモン・マロウの葉っぱを食べてみた。

天ぷらにしてみた。

味がしない・・・花も単品でお茶にすると味がしない・・・体にいいからいいか。
f:id:ponsuke_tarou:20180609215853j:plain

サラダにしてみた。

味がしない・・・何にでも合わせられるともいえる。
f:id:ponsuke_tarou:20180616140012j:plain

炒めてみた。

初めて味がした。ほうれん草っぽいような気がする。
f:id:ponsuke_tarou:20180616140100j:plain

うちのブルーマロウさんの写真集

f:id:ponsuke_tarou:20180528185112j:plain
苗を植えて1ヵ月ぐらい
f:id:ponsuke_tarou:20180707103336j:plain
2018-07-07 初めて花が咲いた



ponsuke-tarou.hatenablog.com

Springのプロジェクトにプロジェクトファセットを設定する。

Tomcatを設定したのでプロジェクトファセットを設定します。
ponsuke-tarou.hatenablog.com

ファセットで、プロジェクトが使うものの定義をします。

  • ファセットの和訳 : 〔宝石などの〕面を刻む、〔物事の一つの〕相、様相

ファセットは、Java EE プロジェクトの特性および要件を定義し、ランタイム構成の一部として使用されます。
ファセットをプロジェクトに追加すると、そのプロジェクトは、特定のタスクを実行し、特定の要求を実現し、または特定の特性を持つように構成されます。
プロジェクト・ファセット

プロジェクトの作成時にはさまざまな情報が収集され、それらに基づいてプロジェクト タイプの特定、標準ライブラリの追加、コンパイラ オプションの設定、パブリッシュ タスクの制御、ビルド パスの設定、アノテーション プロセッサの追加などが行われます。これらの情報は、プロジェクトの作成中にファセットを選択することによって指定します。
http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/ideuserguide/projects/conFacets.html

Eclipseでプロジェクトファセットを設定します。

  1. [Packge Exploer]でプロジェクトを選択します。
  2. 「Command + I」でプロジェクトの設定画面を開きます。
  3. 左側のメニューで[Progect Facets]を選択します。
  4. [Convert to Faceted...]リンクを押下します。f:id:ponsuke_tarou:20180311225506p:plain
  5. [Project Facet]の一覧で[Java]にチェックを入れて[Version]を「1.8」にします。
  6. [Dynamic Web Module]にチェックを入れて[Version]を「3.1」にします。
  7. 下の方に出てくる[Further configuration available...]リンクを押下します。f:id:ponsuke_tarou:20180311230123p:plain
  8. [Modify Faceted Project]画面で以下を設定します。
    • Content directory : /WebContent
      • HTMLや、CSSや、画像ファイルなどのコンテンツを格納するディレクトリルートです。
      • デフォルトで入っていたらそのままで。
    • Generate web.xml....... : チェックする
  9. [OK]ボタンを押下します。
  10. [Dynamic Web Module]で[Runtimes]を押下します。
  11. [Apatch Tomcat v8.0]にチェックを入れます。f:id:ponsuke_tarou:20180311230759p:plain
  12. [Apply] > [OK]ボタンを押下します。

f:id:ponsuke_tarou:20180606155313j:plain

わいるどふらい(WildFly)って何?から学ぶEJB

WildFlyは、オープンソースJavaEEアプリケーションサーバです。

WildFlyは、Javaで記述されたサーバサイドアプリケーションを動作させるための基盤を提供します。
www.ossnews.jp

JBoss Application Serverから改名しました。

WildFly(ワイルドフライ)とは、JBoss AS(コミュニティ版)とJBoss EAPエンタープライズ版)との混同を避けるため2014年4月にJBoss ASが改名された名称です。
その為、名称が変更されたのみとなっており、開発コミュニティ(オープンソースプロジェクト)やソフトウェア自体などJBoss ASと変わりません。
www.ossplaza.com

JBoss Application Server は1999年にEnterprise JavaBeansコンテナとして開発をされたJ2EEアプリケーションサーバです。
www.ossplaza.com

Tomcatとの違いはEJBが使えることです。

同様なサーバサイドプラットフォームとして「Tomcat」があります。
Tomcat」はJSP/Servletを処理するアプリケーションサーバです。
WildFly」は、TomcatをWebコンテナとして搭載しています。そのため、EJBJSP/Servletの両方を処理できます。
www.ossnews.jp

Tomcatで提供される機能は基本的にServlet, JSP, JDBC接続プールのみで、他のものは提供されていません。シンプルですが、他のものが必要になったときに、それらをインテグレーションするコストが発生するなど、少し面倒なことになります。
TomcatになくてJBossにあるものを軽く列挙してみます。

Java EEなもの
JTAトランザクションマネージャ
EJB
MDB
JPA
・JMS
JCA
JAX-WS
JBoss固有なもの
JMX
log4jを用いたログ基盤
・分散キャッシュなどの各種クラスタリングサービス
nekop.hatenablog.com

log4jはログを出力するAPIです。

ponsuke-tarou.hatenablog.com

EJBは、JavaEEに既定されているサーバサイド向けのJavaBeansです。

EJBを利用したシステムの開発者は必要な機能を「Bean」(ビーン)と呼ばれるJavaクラスとして開発していき、これを繋ぎ合わせてアプリケーションを構築する。BeanはEJBの仕様に準拠したアプリケーションサーバに組み込まれて実行される。サーバ側でトランザクション処理やDI(Dependency Injection:依存性注入)、セキュリティ制御などの諸機能を提供してくれるため、Beanの開発者はこれらに個別に対応する必要はなく、自らのビジネスロジックの記述に集中できる。
e-words.jp

まず、JavaBeansはJavaで書かれた再利用可能なソフトウェアコンポーネントのことです。

Java Beansはプログラムの再利用を目的としており、汎用的なロジックで構成されているクラスである。Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 サーバーサイド向けのJavaBeansはEnterprise JavaBeansと呼ばれている。
JavaBeans - Wikipedia

JavaBeansは、Sun Microsystems社のJavaBeans仕様に準拠した再使用可能なソフトウェア・コンポーネントです。JavaBeans仕様は、JavaBeanとなる一式のJavaクラスによって実装されるインタフェースおよびパッケージングの詳細を規定します。 開発者は、JavaBeansをプログラムを使用して組み合せるか、Oracle JDeveloperなどのビジュアル・プログラミング環境を使用してアプリケーションを作成できます。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/javabean/listing.htm

技術的な仕様のことを指してJavaBeansということもあります。

Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 再使用可能なコンポーネントを作成できる。
http://otndnld.oracle.co.jp/tech/java/htdocs/java_roadmap/glossary.htm#434709

JavaBeansの特徴

JavaによるWebアプリケーション入門

①プロパティ

JavaBeansは、「プロパティ」と呼ばれるものをもつJavaクラスです。あるBeanが持つ「属性」を「プロパティ」と考えることができます。
Javaのクラスでは、クラスの属性は、クラス中のフィールドで表現されると考えられます。ところが、あるBeanが持つプロパティは、クラスのフィールドとは関係ありません。ある特定のネーミング・ルールに従ったメソッドの存在が、そのBeanのプロパティを決めているのです。
JavaBeansのネーミング・ルールでは、あるBeanに次のようなメソッドがあるとき、そのBeanにはtitleというプロパティが存在することになります。

String getTitle ( ) ;
void   setTitle ( String title);
  • ネーミング・ルール
    • setter、getter:プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加える
      • setter名 = "set" + ( プロパティ名 )'
      • getter名 = "get" + ( プロパティ名 )'
    • プロパティ名:setter名やgetter名から、先頭の"set"、"get"を取り除いた文字列
      • プロパティ名 = ( setter名から、先頭の"set"を取り除いたもの ) = ( getter名から、先頭の"get"を取り除いたもの )
② 永続化

Beanは、必要に応じてオブジェクトの状態を保存したり、復元したりすることができなければいけません。このことを、Beanを「永続化」する、といいます。このためには、Beanにjava.io.Serializableインタフェースを実装する必要があります。このインタフェースにはメソッドは定義されていないので、次のように定義するだけで構いません。

import java . io . Serializable;

public class HogeBean implements Serializable {
     .....
}
③ 引数無しのコンストラク

Beanには引数無しのコンストラクタが必要です。

import java . io . Serializable;

public class HogeBean implements Serializable {
public HogeBean ( ) {
.....
}
.....
}

Beanの種類

Session Bean:セッションを保持し、一時的なロジックを保存するオブジェクト

ビジネスロジックを実装するためのEnterprise Bean

  • Stateful Session Bean:クライアントごとの状態を保持するセッションBean
  • Stateless Session Bean:クライアントごとの状態を保持しないセッションBean
  • Singleton Session Bean:常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean
Message Driven Bean ( メッセージ駆動型Bean):非同期処理の記述などJMS(Java Message Service)を使い、非同期のメソッドの呼び出しをサポートするEnterprise Bean
Entity Bean:永続的なデータを保存するオブジェクト、(Java EE 7)EJB 3.2で廃止

f:id:ponsuke_tarou:20180529002156j:plain

うちの庭という名の極小花壇

せり科

イタリアンパセリ

  • 学名:Petroselinum neapolitanum
  • 分類:セリ科オランダゼリ属
  • 原産地:地中海
  • 2018-07-07 週に1度は収穫してサラダにしている。

f:id:ponsuke_tarou:20180707225927j:plain

グラジオラス

f:id:ponsuke_tarou:20180626080911j:plain
f:id:ponsuke_tarou:20180626080935j:plain

アボカド

ハス

  • 2018-05-24 数年前に生ゴミを花壇にコンポストしたらガンガン生えてきた。現在4本成長中。虫もつかないが実もつかない。余裕で越冬してひたすらでかくなる。

f:id:ponsuke_tarou:20180529221234j:plain

パッションフルーツ

パッシフロラ・エドゥリス

  • 別名:クダモノトケイ
  • 原産地:ブラジル、パラグアイ
  • 収穫期:6-8月
  • 紫色系は、自家受粉性で1本で実がなる。
  • 2018-05-24 3年で1つしか実がならないがよくでかくなる。

あじさい

名称不明

f:id:ponsuke_tarou:20180520100157j:plain

ダンスパーティー

f:id:ponsuke_tarou:20180528185223j:plain

シソ科

ラベンダー

アングスティフォリア
  • 別名:イングリッシュラベンダー
  • 学名:Lavandula angustifolia
  • 名称不明

f:id:ponsuke_tarou:20180528185004j:plainf:id:ponsuke_tarou:20180609223003j:plain

  • ほのか

f:id:ponsuke_tarou:20180513135643j:plain

ストエカスラベンダー
  • 別名:フレンチラベンダー
  • 学名:Lavandula stoechas
  • 名称不明
    • 2018-05-22 春に盛大に切り戻したので今年のお花は諦める。

f:id:ponsuke_tarou:20180523083420j:plain
f:id:ponsuke_tarou:20180528185203j:plain

ラベンダーデンタータ
  • 別名:フリンジラベンダー、キレハラベンダー
  • 学名:Lavandula dentata
  • 名称不明

f:id:ponsuke_tarou:20180513142024j:plain

  • 名称不明

f:id:ponsuke_tarou:20180528184939j:plainf:id:ponsuke_tarou:20180609223043j:plain

ローズマリー

f:id:ponsuke_tarou:20180520100057j:plain

タイム

  • 別名:タチジャコウソウ、イブキジャコウソウ
  • 学名:Thymus vulgaris L.
  • 分類:シソ科イブキジャコウソウ属(ティムス属)
コモンタイム

f:id:ponsuke_tarou:20180520105234j:plain

ゴールデンレモンタイム
  • 学名:Thymus x citriodorus ”Aureus”

f:id:ponsuke_tarou:20180520105259j:plain

  • 2018-05-29 使いきれなくてオリーブオイルに突っ込んだ。流行りのハーバ何とかっぽい。

f:id:ponsuke_tarou:20180529222042j:plain

スペアミント

f:id:ponsuke_tarou:20180817083414j:plain

マロウ

ゼニアオイ

f:id:ponsuke_tarou:20180707103336j:plain
初めて咲いた花

ユリ科

ゆり

夫婦百合

f:id:ponsuke_tarou:20180520095741j:plain

名称不明

f:id:ponsuke_tarou:20180520102111j:plain
f:id:ponsuke_tarou:20180619223559j:plainf:id:ponsuke_tarou:20180626081022j:plain

デルフィニウム

ブルーミラー

  • 学名:Delphinium chinensis
  • 別名:Larkspur、オオヒエンソウ
  • 耐寒性1年草
  • 2018-05-22 地植えしてから1年草なのを知った。1回目の花をドライフラワーにしたら凄く色が残って良かった。

f:id:ponsuke_tarou:20180513141419j:plain
f:id:ponsuke_tarou:20180528185245j:plain

トリフォリウム

  • 学名:Trifolium

プリンセス・クローバー

  • 学名:Trifolium repens
  • 分類:マメ科シャジクソウ属(トリフォリウム属)
  • 多年草
  • レオノーレ

f:id:ponsuke_tarou:20180513142006j:plain

コウモリラン

  • 別名:ビカクシダ
  • 分類:ウラボシ科ビカクシダ属
  • 原産地:東南アジア、ポリネシア、亜熱帯オーストラリア
  • 樹木や岩などに付着して生育する着生シダ
  • 根を保護したり落ち葉や雨水などを受けるための付着葉と、繁殖のための胞子がつく胞子葉、2種類の葉がある

f:id:ponsuke_tarou:20180520095534j:plain

月桂樹

f:id:ponsuke_tarou:20180520101148j:plain


雲仙コメツツジ

f:id:ponsuke_tarou:20180524083628j:plain

キク科

ムギワラギク

  • 別名:帝王貝細工(ていおうかいざいく)
  • 分類:キク科ムギワラギク属
  • 学名:Xerochrysum bracteatum
コロロ
  • フランボワーズ

f:id:ponsuke_tarou:20180513140444j:plain

ダリア

  • 学名:Dahlia
  • 別名:テンジクボタン
  • キク科テンジクボタン属(ダリア属)
ラベラ・ピッコロ

f:id:ponsuke_tarou:20180523083157j:plain

カモミール

  • 学名: Matricaria chamomilla
  • 分類:キク科カミツレ
  • 2018-05-22 種から育成中。

f:id:ponsuke_tarou:20180524083724j:plain

ティランジア

銀葉種

チランジア・カプトメドゥーサエ

f:id:ponsuke_tarou:20180520234219j:plain

サンスベリア

  • 学名:Sansevieria trifasciata
  • 分類:キジカクシ科チトセラン属(サンスベリア属)※分類体系によってリュウゼツラン科
  • 別名:チトセラン、厚葉千歳蘭

サンスベリア・トリファスキアタ・ローレンティ

  • 学名:Sansevieria trifasciata 'Laurentii'
  • 別名:トラノオフクリンチトセラン
  • 原産地:熱帯アフリカ
  • 2018-05-22 水に入れておいたら切断面から根がめきめき出ていた。

f:id:ponsuke_tarou:20180523083000j:plain

お亡くなりになってしまった方々

すみれ

ムーランフリルネロ
  • スミレ科ビオラ
  • 時間が立つと黒から濃い紫色に変色していく
  • 2018-05-22 ナメクジの餌食中。
名称不明
  • 2018-05-22 ナメクジの餌食中。
  • 2018-06-20 ナメクジの餌食になったところをバッサリ切ったら蘇らなかった・・・。

f:id:ponsuke_tarou:20180523002513j:plain

MacにPython3とPyCharmをインストールする方法

  • 環境 : macOS Catalina Version10.15.6

Mac にはデフォルトでPython2がインストールされています。

% python --version
Python 2.7.16

% which python
/usr/bin/python

Python3 をインストールします。

  1. Download Python | Python.orgを表示します。
  2. pkgファイルをダウンロードします。
    • 今回は「python-3.8.5-macosx10.9.pkg」
    • f:id:ponsuke_tarou:20180512230455p:plain
  3. pkgファイルをダブルクリックしてインストーラーを起動します。
  4. f:id:ponsuke_tarou:20180512231153p:plain
  5. f:id:ponsuke_tarou:20180512231206p:plain
  6. f:id:ponsuke_tarou:20180512231211p:plain
  7. f:id:ponsuke_tarou:20180512231303p:plain
  8. f:id:ponsuke_tarou:20180512231311p:plain

バージョンと場所を確認します。

バージョンを確認するコマンドはPython2だと `python --vesion` でしたが、Python3は `python3 --version` になります。

% python3 --version
Python 3.8.2

% which python3    
/usr/bin/python3
注意:デフォルトであったPython2を消してはなりません。

Apple が提供している Python のビルドは /System/Library/Frameworks/Python.framework と /usr/bin/python にそれぞれインストールされています。これらは Apple が管理しているものであり Appleサードパーティのソフトウェアが使用するので、編集したり削除したりしてはいけません。
4. Macintosh で Python を使う — Python 3.8.6rc1 ドキュメント

統合開発環境であるIDLEを起動します。

  1. Lanchpad から IDLE を起動します。
    • f:id:ponsuke_tarou:20180512233532p:plain
  2. インタラクティブシェル が表示されます。
    • この画面で頑張っているのがインタラクティブシェルという方だそうです。
    • ここで具体的な操作を行うそうです。
    • f:id:ponsuke_tarou:20180513002509p:plain
  3. 「Hellow Python」と表示させてみます。
    • 画面の>>>は入力待ち状態です。
>>> print('Hellow Python')
Hellow Python

統合開発環境であるPyCharmをインストールします。

Homebrewでインストールします。

# インストール前に健康診断します。
% brew doctor
Your system is ready to brew.

# updateもしておきます。
% brew update
Updated 3 taps (homebrew/core, homebrew/cask and homebrew/cask-fonts).
==> New Formulae
#...省略...
==> Deleted Casks
hand-mirror                                                                                      jing

# バージョンはこんな感じに見えました。
% brew --version
Homebrew 2.5.2
Homebrew/homebrew-core (git revision 0b6544; last commit 2020-09-29)
Homebrew/homebrew-cask (git revision be3785; last commit 2020-09-29)

# 無料のCommunity版であるpycharm-ceをインストールします。
% brew search pycharm
==> Casks
pycharm                                pycharm-ce                             pycharm-ce-with-anaconda-plugin        pycharm-edu                            pycharm-with-anaconda-plugin

# brew caskでインストールします。
% brew cask install pycharm-ce
==> Downloading https://download.jetbrains.com/python/pycharm-community-2020.2.2.dmg
==> Downloading from https://download-cf.jetbrains.com/python/pycharm-community-2020.2.2.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'pycharm-ce'.
==> Installing Cask pycharm-ce
==> Moving App 'PyCharm CE.app' to '/Applications/PyCharm CE.app'.
🍺  pycharm-ce was successfully installed!

起動してみます。

  1. f:id:ponsuke_tarou:20200929213418p:plain
    インストールできました。
  2. f:id:ponsuke_tarou:20200929213838p:plain
  3. f:id:ponsuke_tarou:20200929213910p:plain
  4. f:id:ponsuke_tarou:20200929213923p:plain

PyCharmでプロジェクトを作成します。

参考 : ステップ 1. 最初のPythonプロジェクトを作成して実行する-ヘルプ| PyCharm

  1. [New Project]を選択します。
  2. [Location:]でプロジェクトを作成するディレクトリを選択します。
  3. [New enviroment useing]で仮想環境の作成ツールを「Virtualenv」に選択します。
  4. [Base intersepter]にはインストールしたPython3.8が選択されていることを確認します。
  5. [Create]ボタンでプロジェクトを作成します。

f:id:ponsuke_tarou:20201006212140p:plain

仮想環境を作成します。
  1. Command + ,で設定ダイアログを開きます。
  2. [Project: {プロジェクト名}] > [Python Interpeter] > 歯車アイコン > [Add...]でダイアログを開きます。
  3. [Virtualenv Enviroment] > [New enviroment] > [Location:]で仮想環境の作成場所を選択します。
  4. [OK]ボタンで仮想環境を作成します。
    • f:id:ponsuke_tarou:20201006214124p:plain
  5. [OK]ボタンで設定ダイアログを閉じるとプロジェクトツールウィンドウに仮想環境用のディレクトリが表示されています。
    • f:id:ponsuke_tarou:20201006214924p:plain
ライブラリをインストールします。
  1. 画面下にある[Terminal]でターミナルを開きます。
  2. pip install {ライブラリ}の形式で開発に必要なものをインストールする
# 数値計算ライブラリであるNumPyをインストールします。
(venv) pon@mac tryPython % pip install numpy
Collecting numpy
  Downloading numpy-1.19.2-cp38-cp38-macosx_10_9_x86_64.whl (15.3 MB)
     |████████████████████████████████| 15.3 MB 2.9 MB/s 
Installing collected packages: numpy
Successfully installed numpy-1.19.2

# CSVやExcelファイルを読み込めるPandasをインストールします。
(venv) pon@mac tryPython % pip install pandas
Collecting pandas
# ...省略...
Installing collected packages: six, python-dateutil, pytz, pandas
Successfully installed pandas-1.1.3 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0

# pip listでインストールしたライブラリを確認できます。
(venv) pon@mac tryPython %  pip list
Package         Version
--------------- -------
numpy           1.19.2
pandas          1.1.3
pip             20.2.3
python-dateutil 2.8.1
pytz            2020.1
setuptools      50.3.0 
six             1.15.0
ソースファイルを作成します。
  1. プロジェクトツールウィンドウでプロジェクトを選択した状態でCommand + Nでメニューを表示します。
  2. [Python File]を選択してダイアログを開きます。
    • f:id:ponsuke_tarou:20201006220553p:plain
  3. ソースファイル名を入力してEnterでファイルを作成します。
やりたいことをやります。

qiita.com

Windowsにインストールしたい場合

ponsuke-tarou.hatenablog.com

ディジタル証明書の有効性はCRLで確認します。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

特定の認証局が発行したCRLに関する記述のうち,適切なものはどれか。

  1. CRLには,失効したディジタル証明書に対応する秘密鍵が登録される。
  2. CRLには,有効期限内のディジタル証明書のうち失効したディジタル証明書と失効した日時の対応が提示される。>> 正解
  3. CRLは,鍵の漏えい,破棄申請の状況をリアルタイムに反映するプロトコルである。
  4. 有効期限切れで失効したディジタル証明書は,所有者が新たなディジタル証明書を取得するまでの間,CRLに登録される。

平成27年秋期問2 CRLに関する記述|情報処理安全確保支援士.com

CRLは、有効期限内に失効したディジタル証明書の一覧です。

  • 英語 : Certificate Revocation List
  • 日本語 : 証明書失効リスト
  • CRLに書いてあること : 証明書のシリアル番号 と 失効日

CRLとは有効期限よりも前に失効させたデジタル証明書の一覧です。有効期限よりも前に失効させるというのは、例えば証明書の誤発行や証明書の秘密鍵紛失で悪用されるのを回避するための処置です。認証局では、そのような証明書をCRLに登録して管理します。
CRL(証明書失効リスト)とは、OCSPとは | ネットワークエンジニアとして

認証局が管理する、失効済み電子証明書の一覧。
CRLの仕様は、電子証明書と同様にX.509の規格で決められています。また、CRLにはリストを発行した認証局電子署名を行っているので、電子証明書と同じく偽造はほぼ不可能といえます。
証明書失効リスト (CRL)|SSLサーバ証明書 ジオトラスト

本来のユーザーから失効の申し出があると、認証局はその情報を CRL に追加する。また、デジタル証明書の記載内容が変更されることもある。こういった場合も、認証局に申請すると CRL に加えることができる。
【公式】NTTPCコミュニケーションズ

CRLは認証局(CA)から定期的に最新のものが配布されています。CRLの仕様はデジタル証明書の仕様を定めたITU-T X.509で標準化されています。
CRL(Certificate Revocation List) | セコムトラストシステムズのBCP(事業継続計画)用語辞典

有効期限前に失効される理由は色々あるらしいです。

  • 送信データを暗号化する鍵データが入ったパソコンを紛失した >> 誰かが使わないように失効させる
  • 間違って発行してしまった >> 使わないから失効させる
  • 被発行者の規則違反 >> 証明したくないから失効させる

受け取ったデジタル証明書は、CRLを突き合わせて有効かを確認できます。

方法1. CRLファイルをダウンロードして突き合わせて確認します。

CRLファイルを実際に見てみました。
qiita.com

方法2. OCSPというプロトコルを使ってオンラインで確認します。

  • 英語 : Online Certificate Status Protocol
  • 日本語 : オンライン証明書状況プロトコル

OCSP(Online Certificate Status Protocol)は、ブラウザなどのクライアントが、認証局が提供するOCSPサーバーに対して証明書のシリアル番号を問合せ、OCSPサーバーが証明書のステイタスを返すという仕組みです。
証明書の失効:CRL(Certificate Revocation Lists) とOCSP | rms.ne.jp

OCSP は、オンラインで証明書の失効情報を確認するためのプロトコルであり、RFC2560 に規定されています。証明書利用者(OCSP リクエスタ)は、OCSP レスポンダ(OCSP サーバーとも呼ばれる)に失効情報を問い合わせます。OCSP レスポンダは、問い合わせに対して証明書の状態 について、有効(good)、失効(revoked)、不明(unknown) のいずれかとして返します
f:id:ponsuke_tarou:20180411213603p:plain
KI関連技術に関するコンテンツ

デジタル証明書の有効性をリアルタイムで確認するプロトコルOCSPサーバはCA自身や、CRLを集中管理するVAが運営する。OCSPクライアントはサーバに対してデジタル証明書を確認させることによって、自力でのCRL取得や照合の手間を省略できる。
OCSP(Online Certificate Status Protocol)とは - IT用語辞典 e-Words

リアルタイムでディジタル証明書の失効情報を検証し、有効性を確認するプロトコル。対象となるディジタル証明書のシリアル番号をVA(証明書有効性検証局)に送信し、有効性の検証結果を受け取る機能を提供する。
OCSP|情報セキュリティマネジメント試験.com

OCSPレスポンダにサーバが問い合わせをしてその応答をキャッシュしておいて、そのキャッシュを基にクライアントに送信する方法をOCSP Staplingと言います。

OCSP Staplingとは、WebサーバーなどのSSLサーバ証明書を提示するサーバーが認証局OCSPレスポンダーに問合せを行い、そのキャッシュされた結果を、証明書とともにブラウザなどのクライアントに提示するという仕組みです。
このキャッシュされた結果は、サーバーとクライアントのTLS/SSLハンドシェイクの過程でCertificate Status Requestとして利用されます。
rms-digicert.ne.jp

OCSP Stapling(ステープリング)では、クライアントがOCSP要求を行うのではなく、サーバがOCSP要求を行い、その応答をキャッシュする。サーバはキャッシュしたOCSP応答を、サーバ証明書と一緒にクライアントに送信する。これによりクライアントはOCSP responderに問い合わせる必要がなくなり、HTTPS通信の開始を高速化することができる。
https://camo.qiitausercontent.com/106767202f346a246a3401a6e435c2dff007cff1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f353231382f66616361363436622d346533302d656164642d343238612d6437623066303332613433362e706e67

qiita.com

OCSP の問題のひとつは、SSL ハンドシェイク時にウェブサーバとクライアント間の通信に加えて、クライアントが OSCP サーバへ通信するという実質 3 者間の通信になっておりこれが SSL ハンドシェイク時のオーバーヘッドになっていることです。OCSP ステープリングは、ウェブサーバがウェブブラウザの代わりに OSCP レスポンダに問い合わせ、SSL ハンドシェイクの際に OCSP レスポンスをクライアントに提供するというメカニズムです。※ 8 これはすでに IETF RFC6066 で定義されています。
f:id:ponsuke_tarou:20180412000041p:plain
https://www.jp.websecurity.symantec.com/welcome/pdf/wp_ssl_handshake.pdf

実際に見てみました。

qiita.com

CRLを集中管理して検証してくれるのはVAです。

  • 英語 : Validation Authority
  • 日本語 : 検証局
  • 別名 : 証明書有効性検証局

認証局(CA)と違い、デジタル証明書の発行は行わず、検証機能に特化しているためこのように呼ばれる。クライアントからの問い合わせに応じて、CAの公開鍵で署名の正当性を検証したり、証明書の有効期限を確認したりする。
e-words.jp

デジタル証明書の有効性を確認する検証機能のみを行うので、証明書を発行する認証局とは区別する意味合いから異なる名称がついています。VAがCRLを集中管理することで無効な証明書にすばやく対応することができます。
www.secomtrust.net

クライアントからのディジタル証明書の有効性に関する問い合わせに対し、署名の検証、有効期限の確認、CRLの確認などを行い、有効性の可否を応答する役割をもつPKIの機関。
VA|情報セキュリティマネジメント試験.com

f:id:ponsuke_tarou:20180411220714j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

ディジタル署名の公開鍵を保証するディジタル証明書

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

ディジタル証明書に関する記述のうち,適切なものはどれか。

  1. S/MIMETLSで利用するディジタル証明書の規格は,ITU-T X.400で標準化されている。
  2. ディジタル証明書は,TLSプロトコルにおいて通信データの暗号化のための鍵交換や通信相手の認証に利用されている。
  3. 認証局が発行するディジタル証明書は,申請者の秘密鍵に対して認証局ディジタル署名したものである。
  4. ルート認証局は,下位の認証局の公開鍵にルート認証局の公開鍵でディジタル署名したディジタル証明書を発行する。

情報セキュリティスペシャリスト平成29年秋期 午前Ⅱ 問10

ディジタル証明書は、公開鍵暗号方式において公開鍵の正当性を保証するものです。

デジタル署名だけではそもそも配布されている公開鍵が本当に正しい公開鍵(下図ではAさんの公開鍵)なのかを確認することができません。デジタル署名の解析用の公開鍵が正しいことを証明するためにはデジタル証明書を使用します。
https://www.infraexpert.com/studygif/security17.gif
デジタル証明書の仕組み

デジタル証明書は、証明したい内容に対して「ハッシュ化」と「秘密鍵による暗号化」を行ったものです。
証明書を信頼できる第三者機関から発行してもらうことで、公的な確認(証明)ができる仕組みです。
デジタル署名とデジタル証明書 CapmNetwork

デジタル署名単独では公開鍵が本人のものであるか確認できないが、デジタル証明書をデジタル署名に付属させることにより、データが改ざんされていないこととともに(この機能はデジタル署名単独で実現できる)、データの作成者を認証局を通して証明することができる。
デジタル証明書(電子証明書)とは - IT用語辞典 e-Words

受信者に届いたデータは、送信者からのデータであることを確認できます。

ディジタル証明書をもつA氏が,B商店に対して電子メールを使って商品の注文を行うときに,A氏は自分の秘密鍵を用いてディジタル署名を行い,B商店はA氏の公開鍵を用いて署名を確認する。この手法によって実現できることはどれか。ここで,A氏の秘密鍵はA氏だけが使用できるものとする。

ウ. B商店に届いた注文は,A氏からの注文であることを確認できる。
平成26年秋期問37 ディジタル証明書で確認できること|基本情報技術者試験.com

ディジタル証明書は、認証局(CA)と呼ばれる第三者機関によって発行された、個人や企業(のサーバ)に対する電子式の証明書です。
ディジタル証明書には「発行者ID」「主体者ID」「有効期間」などの情報が含まれ、その信頼性を保証するため認証局ディジタル署名が付されています。
平成27年春期問45 社員のスマートフォンの認証|基本情報技術者試験.com

ディジタル証明書の有効性はCRLで確認します。

ponsuke-tarou.hatenablog.com

SSL/TLSでのクライアントとサーバでのやり取りではディジタル証明書が使われます。

ponsuke-tarou.hatenablog.com

f:id:ponsuke_tarou:20180408213510j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

送ったデータの完全性を保証するためのディジタル署名

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

XMLディジタル署名の特徴はどれか。

  1. XML文書中の、指定したエレメントに対してデタッチ署名(Detached Signature)することができる。
  2. エンベローピング署名(Enveloping Signature)では一つの署名対象に必ず複数の署名を付ける。
  3. 署名形式として、CMS(Cryptographic Message Syntax)を用いる。
  4. 署名対象と署名アルゴリズムをASN.1によって記述する。

平成28年秋期問4 XMLディジタル署名の特徴|情報処理安全確保支援士.com

ディジタル署名でデータがなりすましや改ざんが行われていないことを証明します。

・ファイルにくっつけるデータだよ
・ファイルの正当性を証明するよ
・誰が作ったかを示すよ
・改ざんされていないことを示すよ
デジタル署名とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

https://www.ninsho.co.jp/explanation/images/digitalsign01.gif
NDN:電子入札・電子認証講座|電子署名|日本電子認証株式会社

送信者は、メッセージの原文から一定の計算手順で割り出した短いデータを文書に添付して送信する。受信者は受け取った署名データを一定の手順でこれを検証することにより、文書に署名を行ったのが送信者本人であることや、文書が通信途上で改ざんされていないことなどを確認することができる。
電子署名(デジタル署名)とは - IT用語辞典 e-Words

送信側のデータをハッシュ値にしてデータと一緒に送信し、受信側でもデータをハッシュ値にして比較することで改ざんされていないことを確認する仕組みをメッセージ・ダイジェストといいます。

https://www.ibm.com/developerworks/jp/websphere/library/web/web_security/i/1_8.gif
Webセキュリティー入門 第1回「セキュリティー対策を考える」 – IBM Developer

https://thinkit.co.jp/images/marugoto/2/1/9/27.gif
[ThinkIT] 第9回:メッセージダイジェスト関数 (1/2)

データから生成したハッシュ値ダイジェスト値といいます。

https://www.ipa.go.jp/security/pki/images/image019.png
PKI関連技術に関するコンテンツ

データのダイジェスト値ハッシュ関数で取得して、それを秘密鍵で暗号化します。

データの送信者はまず作成したデータを自分の秘密鍵を使って暗号化するとともに、データのハッシュ値ハッシュ関数によって算出する。ハッシュ値は、元のデータを逆算できないという特殊な値で、算出したハッシュ値を自分の秘密鍵を使って暗号化する。送信者は受信者にあらかじめ公開鍵を渡しておき、暗号化したデータと暗号化したハッシュ値を受信者に向けて送信する。
KDDI株式会社――Tomorrow, Together

「署名」はハッシュ値を暗号化した値のことです。

デジタル署名を利用する前提として、送信者と受信者の間で公開鍵の入手とハッシュ関数の共有が必要となる。仕組みとしては、送信者はデータの一部分のハッシュ値を計算し、それをあらかじめ入手してある送信先の公開鍵で暗号化する。そして、元データとともにその暗号化したハッシュ値(署名)を送信する。
デジタル署名 − @IT ネットワーク用語事典

メッセージダイジェスト(またはハッシュ値)と呼ばれるデータを暗号化します。メッセージダイジェストハッシュ値)とは、本文より「ハッシュ関数」という一方向関数を用いて抽出したビットデータのことを言います。「ハッシュ関数」という関数を用いると、本文から一定の長さのビット列(0と1の羅列)が抽出されます。ハッシュ関数とは、ビット列から全く異なるビット列と作り出す関数になります。
デジタル署名・電子署名とは何か?|ハッシュ関数とメッセージダイジェスト

f:id:ponsuke_tarou:20201001223305j:plain
新潟の月岡温泉で買ったがま口

XMLディジタル署名XML要素として署名を付けられます。

  • 英語 : XML digital signature
  • 別名 : XML署名

XMLディジタル署名には、以下の特徴があります。

・署名対象、署名アルゴリズムメッセージダイジェストおよび証明書などをXMLの文法で表現している。
ディジタル署名XMLタグ付き言語であり分かりやすい。
・任意のデータファイルやXML文書の全体だけではなく、XML文書の一部に対しても署名を付けることができ、部分署名や多重署名などができる。
XML署名で参照する暗号アルゴリズムなどのオブジェクトの識別子は、W3Cなどで定めているURIを参照する。
平成28年 秋期 情報セキュリティスペシャリスト 午前II 問4

署名対象のダイジェスト値ハッシュ値)を求め、ダイジェスト値を子要素としてXML署名情報要素に入れ、さらにその署名情報要素に対してダイジェスト値と署名値を計算し挿入する。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

XML 署名では、XML ドキュメントに埋め込むか、別の方法で XML ドキュメントに関連付けることができる一連の XML 要素を定義します。これによって、受信者は、メッセージが変更されておらず、送信者が意図したとおりのものであることを確認できます。
https://msdn.microsoft.com/ja-jp/library/cc465608.aspx

デジタル・コンテンツに対するデジタル署名に署名し、それを検査するための XML 構文および処理規則を定義する仕様です。 この仕様は、World Wide Web Consortium (W3C) および Internet Engineering Task Force (IETF) による共同開発です。
IBM Knowledge Center

インターネット上での情報交換のためのフォーマットとしてXMLが使われるので、XMLデジタル署名を付与するする必要があります。

近年、インターネット上での情報交換のためのフォーマットとして、XML(eXtensible Markup Language)が注目を浴びています。XML は拡張可能なマークアップ言語 [75] であり、テキストファイルでありながら構造化された情報を柔軟に扱うことができます。XML は、HTML の元ともなった SGML から、インターネットでの情報交換に必要な箇所を抽出したサブセットです。

XML 文書に対する改ざん、なりすましを防ぐために、デジタル署名の機能が求められています。現在、XMLデジタル署名を付与するための規格として、W3C (World Wide Web Consortium) において「XML 署名(XML Signature)」の標準化が進められています。XML の署名要件(RFC2807)、XML 署名構文と処理(RFC3075)、XML の正規化 (RFC3076) が RFC として公表されています。
PKI関連技術に関するコンテンツ

XML署名の種別

http://image.itmedia.co.jp/ait/articles/0207/24/r12webserv01.gif
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

https://www.ipa.go.jp/security/pki/images/image087.png
https://www.ipa.go.jp/security/pki/images/image088.png
PKI関連技術に関するコンテンツ

XML文書中の任意のエレメントに対してつけることができるのがデタッチ署名です。

  • 英語 : Detached Signature

対象データと署名を別々のところに置いとけるのはデタッチ署名です。

Detached Signature(デタッチ署名)
署名要素と署名対象要素が独立している場合の署名形式。(署名対象別のファイルである場合や同じXML文書内でも要素の親子関係がないときなど)
平成28年秋期問4 XMLディジタル署名の特徴|情報処理安全確保支援士.com

署名対象要素と署名要素が独立した署名形式(sibling elements)である。
Detached署名は、署名対象データに任意の電子ファイル(Word、ExcelMPEG画像データ、XML文書など)を指定して、署名対象データをXML署名部分とは独立させ外部ネットワークやローカルファイルに置くことができる。またXML文書内にXML署名要素とXML署名対象要素を並列に配置させることもできる。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

エンベロープ署名は、複数の人の署名を付けられます。

署名要素が署名対象要素の子要素となる署名形式である。
Enveloped署名は同じ文書に複数人の署名を付けるなどの用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

エンベローピング署名では署名要素の子要素として対象データを指定します。

署名要素が署名対象要素の親要素となる署名形式である。
Enveloping署名は署名対象要素を包含した形式で、医療のカルテのように初めの医師が署名したカルテに、次の医師が新しく書き添えた部分のみに署名を加えていくような用途に適している。
XMLデジタル署名とXML暗号:Webサービスのセキュリティ(2) - @IT

f:id:ponsuke_tarou:20180408212311j:plain

次回の勉強内容

ponsuke-tarou.hatenablog.com

パラメータと引数の違い

似ているし、意思疎通にはそれほど困らないけど・・・「引数 == パラメータ」ではないです。

パラメータと引数の違い

パラメータは、関数に受け渡されるものの宣言す。

/*
 * pra1とpra2は、パラメータです。
 * JavaDocでも「@param」で説明を書きます。
 */
private void calledMethod(int pra1, String pra2) {
・・・・
}

 ・メソッド(や関数)に定義されているのは「パラメータ」(もしくは「パラメータ変数」)。

 ・メソッド(や関数)に定義されたすべてのパラメータ群は「パラメータ リスト」と呼びます。
blog.masahiko.info

パラメータは、プロシージャが呼び出されるときに期待する値を表します。パラメータは、プロシージャの宣言で定義されます。
パラメータと引数の違い

関数の定義の中で関数に渡す値として定義されている値。
パラメータと引数の違い | 同じと思っていない?

引数は、関数に渡した実際の値のことです。

// arg1とarg2は、引数です。
private void callMethod() {
    int arg1 = 5;
    String arg2 = "五";
    calledMethod(arg1, arg2);
}

・メソッド(や関数)のパラメータに渡された値*1は「引数」(「パラメータ値」との言い換えも可能)。

 ・メソッド(や関数)のパラメータ群に渡されたすべての値群は「引数リスト」と呼びます。
blog.masahiko.info

引数は、プロシージャを呼び出すときに、プロシージャのパラメータに渡す値を表します。呼び出し元のコードは、プロシージャを呼び出すときに引数を渡します。
パラメータと引数の違い

関数を呼び出すときに渡す値。
パラメータと引数の違い | 同じと思っていない?

仮引数と実引数の違い

仮引数は、パラメータのことです。

仮引数とは関数定義時に使用される引数のことである。
仮引数と実引数

http://wa3.i-3-i.info/img/diff/200/df00271-4.png
http://wa3.i-3-i.info/diff271programming.html

www.weblio.jp

実引数は、引数のことです。

実引数とはその関数を実際に使用するときに関数に引き渡される引数のことである.
仮引数と実引数

http://wa3.i-3-i.info/img/diff/200/df00271-5.png
http://wa3.i-3-i.info/diff271programming.html

仮引数と実引数の違いは、パラメータと引数のそれと同じです。

メソッド定義のパラメータ変数のことを仮引数という。
呼び出し側でメソッドに渡すパラメータのことを実引数という。
blog.codebook-10000.com

仮引数も実引数も「~な引数」で理解が難しいです。

仮パラメータと実パラメータの違い

仮パラメータは、パラメータのことです。

実パラメータは、引数のことです。

仮パラメータと実パラメータの違いは、パラメータと引数のそれと同じです。

仮引数も実引数も用語説明があまり見当たらなくてで理解が難しいです。

こんな感じで使われています。

変数パラメータの実引数は仮パラメータと正確に同じ型でなければなりません。
E2033 変数実パラメータと変数仮パラメータとは同一の型でなければなりません (Delphi) - RAD Studio

関数を呼び出すとき、その関数が受け取る引数の数、それぞれの引数の型が一致していなくてはならない。引数の数が一致しないとエラーになる:
[エラー] 実パラメータが足りません
Add 関数は 2 つの引数を受け取るので、引数 1 つでこの関数を呼び出すことはできない。
関数

プロシージャ呼び出し時の実パラメータ・リスト
プロシージャ定義時の仮パラメータ・リスト
パラメータ渡し

まとめ

関数が受け取るものの定義 関数に渡す値
パラメータ 引数
仮引数 実引数
仮パラメータ 実パラメータ

EclipseでTomcatを設定する。

前回は、プロジェクトにSpringを設定しましたがTomcatを設定していないことに気が付きました。

ponsuke-tarou.hatenablog.com

Tomcatは、Java ServletJSP を実行するためのWebコンテナです。

f:id:ponsuke_tarou:20180301224225p:plain

Apache License 2.0を採用したオープンソースソフトウェア。
2005年以降、Apacheソフトウェア財団のトップレベルプロジェクトのひとつであるApache Tomcat Project 内で開発されている。
それ以前はかつて存在していたJakartaプロジェクト内で開発されていた。
Apache Tomcat - Wikipedia

オープンソースのソフトウェアで、JavaサーブレットJSPを処理するアプリケーションサーバTomcatは単独でWebサーバとして動作することも可能だが、ApacheIISプラグインと動作できるようになっており、実際にはプラグインとしての利用が主流である。
Tomcatは主なUNIX系OSWindowsMac OS Xなどで動作する。Sun Microsystems社からJavaサーブレットJSPのリファレンス実装として認められたソフトウェアで、利用者も非常に多い。
e-words.jp

Webコンテナは、Javaサーブレットの実行環境となるソフトウェアです。

Java EE アーキテクチャのWebコンポーネント規約を実装するソフトウェア。
この規約では、コンピュータセキュリティ、並列性、ライフサイクル管理、トランザクション処理、デプロイやその他のサービスを含むWebコンポーネントの実行環境を規定している。WebコンテナはJava EEプラットフォームAPIを利用したJSPコンテナとしての機能も提供する。
Webコンテナ - Wikipedia

サーブレットはWebサーバ上で動作させるJava言語で書かれた簡易なプログラムで、クライアント(Webブラウザなど)からの要求を受けて処理を行い、結果をWebページとして送信する。サーブレットは単体では動作せず、Webサーバからの処理要求を受け付けてサーブレットの記述に従って実際の処理を行うソフトウェアが必要で、これをサーブレットコンテナという。
e-words.jp

f:id:ponsuke_tarou:20210123112409j:plain
台東区浅草の鶴の湯

Macの場合

Tomcatを配置します。

  1. Apache Tomcat® - Apache Tomcat 8 Software Downloadsへアクセスします。
  2. 好きなバージョンの.tar.gz をダウンロードして解凍します。
    • f:id:ponsuke_tarou:20180301230312p:plain
  3. 解凍した「apache-tomcat-8.0.23」(バージョンによって末尾は変わる)をApplicationsディレクトリ配下に移動します。
    • f:id:ponsuke_tarou:20180301230429p:plain
  4. Tomcatに権限を付与します。
  5. Tomcatを起動します。
  6. ブラウザで「http://localhost:8080/」にアクセスします。
    • f:id:ponsuke_tarou:20180301230942p:plain
  7. Tomcatを停止します。
# Tomcatに権限を付与します。
$ chmod 755 /Applications/apache-tomcat-8.0.23/bin/startup.sh
$ chmod 755 /Applications/apache-tomcat-8.0.23/bin/shutdown.sh

# Tomcatを起動します。
$ /Applications/apache-tomcat-8.0.23/bin/startup.sh 
Using CATALINA_BASE:   /Applications/apache-tomcat-8.0.23
Using CATALINA_HOME:   /Applications/apache-tomcat-8.0.23
Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH:       /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar
Tomcat started.

# Tomcatを停止します。
$ /Applications/apache-tomcat-8.0.23/bin/shutdown.sh 
Using CATALINA_BASE:   /Applications/apache-tomcat-8.0.23
Using CATALINA_HOME:   /Applications/apache-tomcat-8.0.23
Using CATALINA_TMPDIR: /Applications/apache-tomcat-8.0.23/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Using CLASSPATH:       /Applications/apache-tomcat-8.0.23/bin/bootstrap.jar:/Applications/apache-tomcat-8.0.23/bin/tomcat-juli.jar

EclipseにTomactのプラグインを入れます。

方法は2つあるので好きな方を選びます。

zipファイルでインストールする方法
  1. Eclipse Tomcat Pluginへアクセスします。
  2. zipファイルをダウンロードします。
    • f:id:ponsuke_tarou:20180301235556p:plain
  3. [Help] > [Install New Software]を選択します。
  4. [Work with] > [Add...]ボタン > [Archive]ボタン > ダウンロードしたzipファイルを選択 > [OK]ボタン
  5. [Tomcat Plugin]にチェックを入れます。
  6. [Next>]ボタン > [Next>]ボタン > [I accept the........]を選択 > [Finish]ボタン
  7. Eclipseを再起動します。
  8. Tom猫マークが表示されます。
    • f:id:ponsuke_tarou:20180302000344p:plain
Eclipse Marketplaceでインストールする方法
  1. [Help] > [Eclipse Marketplace]でダイアログを開く
  2. [Find]に「tomcat」を入力して検索する
  3. 検索結果に表示された「Eclipse Tomcat Plugin x.x.x(バージョン)」の[Install]ボタンでダイアログを開く
    • f:id:ponsuke_tarou:20200609111645p:plain
  4. [License text:]で「I accept...」を選択して[Finish]ボタンでインストールする
  5. Eclipseの再起動を促されるので再起動する

EclipseTomcatを設定します。

  1. 環境を設定します。
  2. [Windows] > [Preferences] > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択します。
  3. [Tomcat ホーム] > [Browse...]ボタン > 「/Applications/apache-tomcat-8.0.23」を選択します。
  4. コンテキスト宣言モードを選択します。
    • f:id:ponsuke_tarou:20180302001451p:plain

「コンテキスト宣言モード」は、コンフィグレーションファイルの選択となります。
「server.xml」を選択すると、\conf\server.xml にアプリケーションコンテキストの設定が更新されます。
「コンテキストファイル」を選択すると、指定したディレクトリ(デフォルトは \conf\Catalina\localhost)にアプリケーションコンテキストの設定ファイル(プロジェクト名.xml)が作成されます。
proenomichi.blogspot.jp

  1. Eclipseに設定されているJavaのバージョンを確認します。
    1. [Windows] > [Preferences]で[Preferrence]ダイアログを開きます。
    2. [Java] > [Installd JREs]を開いて、インストールしたTomcatに合ったものがdefaultになっていることを確認します。
  2. サーバを追加します。
    1. [Servers]タブを表示してリンクをクリックします。
      • f:id:ponsuke_tarou:20180302002753p:plain
    2. [Apache] > [Tomcat v8.0 Server]を選択して、[Next>]ボタンを押下します。
      • f:id:ponsuke_tarou:20180302002758p:plain
    3. [Tomcat install directory:]の[Browse...]ボタンを押下してTomcatが置いてある「/Applications/apache-tomcat-8.0.23」を指定します。
    4. [JRE:]で「Workbench default JRE」を選択します。
      • f:id:ponsuke_tarou:20180304135740p:plain
    5. [Finish]ボタンを押下すると[Server]にTomcatが追加されます。
      • f:id:ponsuke_tarou:20180302002807p:plain
  3. アプリケーションを動かしてみます。
    1. [Project] > [Clean...] を押下してプロジェクトをクリーンします。
    2. [Package Exploer]でプロジェクトを選択して右クリックします。
    3. [Run As] > [Run on Server] を押下するとダイアログが表示されます(されないこともあります)。
    4. ダイアログで Tomcat を選択して [Finish] を押下します。
      • 毎回、同じサーバを使用するのであれば「Always use this server when running this project」にチェックを入れておきます。
    5. http://localhost:8080/{プロジェクトの名前}/ にアクセスすると「Hellow World!!」が表示されました。
      • f:id:ponsuke_tarou:20180615141014p:plainf:id:ponsuke_tarou:20180615141039p:plainf:id:ponsuke_tarou:20180615141223p:plain

f:id:ponsuke_tarou:20210123105118j:plain
台東区の帝国湯(お湯が尋常じゃなく熱い)

Windowsの場合

  • 環境
    • Windows10 Pro 64bit
    • Eclipse Version: Oxygen.3a Release (4.7.3a)

qiita.com

Tomcatを配置します。

  1. Apache Tomcat® - Apache Tomcat 8 Software Downloadsのサイトからzipファイルをダウンロードする
    • f:id:ponsuke_tarou:20210123105520p:plain
  2. 任意のフォルダに解凍する
  3. 起動してみる
    1. startup.shで起動する
      • f:id:ponsuke_tarou:20210123105558p:plain
        初回の起動の場合はダイアログが表示されるので[アクセスを許可する]ボタンを押下する
  4. http://localhost:8080/ をブラウザで表示して起動することを確認する
    • f:id:ponsuke_tarou:20210123105643p:plain
  5. shutdown.shで停止する
# startup.shで起動する
$ /path/to/apache-tomcat-8.5.47/bin/startup.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
Tomcat started.

# shutdown.shで停止する
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar

EclipseTomcatを設定します。

  1. Eclipseを起動する
  2. f:id:ponsuke_tarou:20210123105900p:plain
    [ヘルプ] > [Eclipseマーケットプレース] > [検索] > 「tomcat」で「Eclipse Tomcat Plugin」を検索してインストールする
  3. f:id:ponsuke_tarou:20210123110104p:plain
    Eclipseの再起動が促されるので再起動するとTom猫マークが表示される
  4. [設定]ダイアログ > [Tomcat] > [Tomcatバージョン] > [Version 8.X]を選択
  5. [Tomcat ホーム] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
  6. [コンテキスト宣言モード] > [コンテキスト・ファイル]を選択
  7. [適用して閉じる]ボタンで[設定]ダイアログを閉じる
  8. [サーバー]タブ > 右クリック > [新規] > [サーバー] > ダイアログを表示
    • f:id:ponsuke_tarou:20210123110213p:plain
      まだサーバを何も設定していなければリンクが表示されるので、そのリンクをクリックするとダイアログが表示される
  9. [Apache] > [Tomcat v8.8 Server]を選択 > [次へ>]ボタン
  10. [Tomcatインストール・ディレクトリー:] > [参照...]ボタン > Tomcatを解凍したフォルダを選択
  11. [JRE:] > インストールしたTomcatに合ったバージョンを選択(Apache Tomcat® - Which Version Do I Want?) > [完了]ボタンでTomcatを追加する
  12. [サーバー]タブに表示されたTomcatをダブルクリック > [ポート] > 変更の必要があれば変更する(他のサーバと被らない様にする等)

f:id:ponsuke_tarou:20210123112202j:plain
荒川区の帝国湯

失敗したこと

Java/bin/java: No such file or directory

# shutdown.shを実行したら怒られました。
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /c/Program Files (x86)/Common Files/Oracle/Java
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
/path/to/apache-tomcat-8.5.47/bin/catalina.sh: line 520: /c/Program Files (x86)/Common Files/Oracle/Java/bin/java: No such file or directory

Could not contact [localhost:8005]. Tomcat may not be running.

# shutdown.shを実行したら怒られました。
$ /path/to/apache-tomcat-8.5.47/bin/shutdown.sh
Using CATALINA_BASE:   /path/to/apache-tomcat-8.5.47
Using CATALINA_HOME:   /path/to/apache-tomcat-8.5.47
Using CATALINA_TMPDIR: /path/to/apache-tomcat-8.5.47/temp
Using JRE_HOME:        /path/to/Java/jdk1.8.0_231/
Using CLASSPATH:       /path/to/apache-tomcat-8.5.47/bin/bootstrap.jar:/path/to/apache-tomcat-8.5.47/bin/tomcat-juli.jar
11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer
▒d▒▒: Could not contact [localhost:8005]. Tomcat may not be running.
11 12, 2019 10:49:04 ▒ߑO org.apache.catalina.startup.Catalina stopServer
▒d▒▒: Catalina.stop:
java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
...省略...
<!--変更前-->
<Server port="8005" shutdown="SHUTDOWN">
<!--変更後-->
<Server port="8080" shutdown="SHUTDOWN">

The CATALINA_HOME environment variable is not defined correctly

# バッチを使ったら怒られた。
$ /path/to/apache-tomcat-8.5.47/bin/startup.bat
The CATALINA_HOME environment variable is not defined correctly
This environment variable is needed to run this program

次は、Spring MVC の設定をしていきます。

ponsuke-tarou.hatenablog.com