Apache+PHP on Mac でWordPress

かな〜り久しぶり。で、備忘録。

Mac Miniを諸々の理由から購入したので、諸々遊ぼうかと。で、表題の通りのことをやりたい。

まずは、Apache。これは既にMacに入ってる。なので、これを起動するだけ。

sudo apachectl start

DocumentRootは標準で

/Library/WebServer/Documents

設定関連は

/etc/apache2/

で、次にPHP。以前はPHPは標準でMacに入っていたが、これが無くなったので、Homebrewから入れる。さらにPHPを導入するまでは以下を参照。

https://qiita.com/ynack/items/ab150213f23f11a03cbc

ちなみに、途中のPHPのパス設定は、HomebreでのPHPインストール最後に表記される内容で2コマンド実施を提案されるので、それを実施することでOK。

次にMySQL。これもHomebrew経由。

brew install mysql

任意のユーザー作って、許可与えて、DB作っては特に変わらない。

で、任意のフォルダにwordpress展開して、DocumentRootを指定して完了。

ちなみに、Apacheのユーザーは「_www」グループは「_www」となっている。なので、こいつらの所有にしてやらんとめんどい。

以上。

C#でのSSLによるサービス(SOAP)通信とクライアント認証

いやぁ、かなりのご無沙汰。1年以上書いてないとは。。w

書くネタについては溢れんばかりにあるけれど、書くのが面倒で書いてない。。。つくづくこういう行為があっていないのだなぁと思います。

さて、タイトルにあるようにC#でSSL通信のSOAPを利用しようとしたら、めっちゃ躓いたので、備忘録。

まず、クライアント認証について。

クライアント認証は、ものすごく簡単に説明すると、リバースプロキシによる実サービスへのディスパッチ時に証明書による認証を要するもの、って認識です。間違っていたらすんません。

で、公開されているサービスをクライアント認証に対応させるために、どうやったら良いのかが分からず、最終的にはMicrosoftの有償チケット使ってしまった。。。(実際にはネット上に情報は溢れていたんだけど。。。)さらに、自分の用途では、通常のHTTPでのサービスとリバースプロキシ経由HTTPSでのサービスを切り替える必要があったので、さらに難解(当者比)になってしまった。

基本的にクライアント認証は、Windowsの証明書に組み込まれたものを利用する。まずはこの証明書を取得することが必要となる。取得するには、下記のコードを準備する。元ネタはここ

       public static X509Certificate2 GetCertificateFromStore(string certSubjectName)
        {
            X509Store store = new X509Store(StoreLocation.CurrentUser);
            try
            {
                store.Open(OpenFlags.ReadOnly);

                X509Certificate2Collection certCollection = store.Certificates;
                X509Certificate2Collection currentCerts = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
                X509Certificate2Collection signingCert = currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certSubjectName, false);

                if (signingCert.Count == 0)
                    return null;

                return signingCert[0];
            }
            finally
            {
                store.Close();
            }
        }

コード内の「X509FindType.FindBySubjectDistinguishedName」は色々種類があるのだけれど、証明書内のどの項目で探すのかによって変更する。staticかどうかは、まぁ、好み。これによって得られたクライアント証明書をこの後の設定で利用する。

次に、VisualStudioのサービス参照追加でサービス用のProxy Classを作成した場合、以下のように証明書を添付する。

service.ClientCredentials.ClientCertificate.Certificate = cert;

「service」はProxy Classのインスタンス、「cert」は上記で取得したX509Certificate2。これにより、クライアント認証はOK。

で、通常のSSLで公開されているサービスであれば、証明書はちゃんとしたものであるので、サービス参照追加で作成が(多分)可能なんだけど、今回はテスト環境なのでオレオレ証明書。そうなるとサービス参照追加でSSL/TLSの確率ができねぇ!って言われて、ちゃんと作成できない。証明書を登録しても、SANを追加してもダメ。。。

なので、まずはサービスの実体を使ってProxy Classを作成する。その上で、app.configに追加されたEndpointをリバースプロキシのURLに変更。これにより、SSLの通信になって、且つ、クライアント認証もできるはず。。。と思ったら、出来なかった。。。。エラーとして、以下のようなものがでる。

System.ArgumentException: '指定された URI 形式 'https' は無効です。有効な URI は 'http' です。
パラメーター名:via'

で、諸々調べたら、app.configのBinding情報に以下の追加が必要だった。(これ調べるのに時間掛かった。。。orz)

<binding name="HogeSoap11Binding">
    <security mode="Transport">
        <message clientCredentialType="Certificate" algorithmSuite="Default"/>
        <transport clientCredentialType="Certificate" proxyCredentialType="Basic" />
    </security>
</binding>

追加する部分は<security>の部分だけど、この中身についてはSSLの実装内容によって変わるみたい。(未検証)で、この項目はコードからも追加できる。

var binding = (System.ServiceModel.BasicHttpBinding)SessionValues.users.ChannelFactory.Endpoint.Bindingbinding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
binding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Default;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;

これにより、SSLでの通信ができて、クライアント認証もできることになる。

さらに、HTTPとHTTPSを切り替える、というか、コード内でEndpointのURLを変更するには、下記のコードでできる。

Hoge.HogePortTypeClient("HogeHttpSoap11Endpoint", new EndpointAddress("https://hogehogte.com/~~~"));

これにより、任意のURLにEndpointを切り替えられる。

ふぅ〜久しぶりに長文を書いた。足りない部分もあるけれど、備忘録としては十分。ではでは〜。

RedmineのEasyGantt導入

現在面倒見ているサーバーのRedmineで、ガントチャート周りの機能がもう少し欲しいなぁと思って探したら、EasyGanttなるものを発見したので、早速導入してみた。

が、これが大変だったので、ちょっとだけ共有。

実際に入れてみたいな、と思ったきっかけの記事はこちら。

僕がredmineに入れてる便利なプラグインとデザインの格好良いテーマ

確かに便利そうだと思い、導入使用としたのだけれど、導入してもどういうわけかチャートの中身が表示されない。ボタン類もJavascriptの実体の無いものへのリンクのみで明らかにちゃんと動いていない。。。しかもエラーがログに吐かれていない。

ん〜困った。。。ということで、本番サーバーはそのままにして(元のまま)、ローカルのVMで同じ環境作って検証してみたところ、上手くいったので、その情報を記載する。

まず環境は以下の通り。

  • Debian Stretch
  • Redmine 3.3.1
  • Ruby 2.3.3
  • PostgreSQL 9.6.4

全てDebパッケージによるインストール。で、上記サイトに加え、ここに以下のサイトなどを参考にEasyGanttを入れて見たところ、正常動作しない。

で、あきらめて、一念発起。VMで上記環境を作り出し、Redmineのみを手動で3.4を入れる、という方法を試してみたところ、あっさりと動作した(笑

主には、以下のサイトが大変役に立った。

1つめのはUbuntuだけど、まぁね。

すこし注意するのは、Apache設定の時のPassengerのロード部分。

Debianのパッケージ版のものを入れる場合は、mods-enabled/mods-availableのpassenger.confをこんな感じで記載する。

  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
  PassengerDefaultUser www-data
  RailsBaseURI /redmine

これは、パッケージで入れたときにあったものを流用しているけど、スクラッチで入れたときと大きく異なるので注意かなと。

あとはApacheのreloadすれば見れるはず。

ではでは!

Tomcat8.5における認証パスワードのDigest化

嵌まったねぇ~w

まず、Tomcatでは、BASIC、DIGEST、FORMなどの認証は、当たり前のようにサポートされている。で、Digest認証っていうのは、通信の際のパスワードを暗号化するもので、例えばJDBCでのパスワード検証を行おうとすると、DBの中にいれておくのは、平文となる。

ここで、「平文での保存はねぇ。。。。」と思うのが普通で、パスワード自体を暗号化して保存しておきたくなる。ここからが、今回の嵌まりどころ。

まず、Tomcatでは、Realmディレクティブに対して「digest=”MD5″」みたいなattributeを加えれば、パスワード照合をMD5でやる!っていうふうな記事をいくつもみつけたので、それに従ったけど、まったく暗号化された文字列では照合せず、平文バリバリで照合していた。

で、最終的に辿り着いたのは、StackOverflowの記事と、(やっぱり)本家Apacheの文章。そこでわかったのが、Realm定義の中側に、「CredentialHandler」の定義が必要で、その中でMD5なりSHAなりを指定する必要があるということ。なので、こんな感じのcontext.xmlを書く事になる。

さらに、MD5のDigestedなパスワードも、いわゆる32桁のハッシュ値ではなくて、Javaのライブラリを使ったものである必要がある。これがよくわからず、結果的に1日費やして、やっとわかった。いや、本家のサイトには「パスワードを生成する2つの方法」として書いてある。。。ちゃんと本家のサイトの通りにやらないといけないのね。。。w

これをDBに保存して、やっとこさ、認証ができた。昔はこんなことばかりやってたから、今こんな感じで解決できるけど、経験してないと途中で投げ出したくなるな。。。w

<Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="org.postgresql.Driver"
connectionURL="jdbc:postgresql://localhost:5432/TEST"
connectionName="test"
connectionPassword="test"
userTable="m_user"
userNameCol="userid"
userCredCol="passwd"
userRoleTable="m_user"
roleNameCol="user_post_id" >
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="MD5" />
</Realm>

ではでは~。

Tomcat + Axis2 でSOAP! with Eclipse!

業務系のシステムを作成していると、やはり、SOAPでのやりとりってのは、非常にわかりやすく、開発がしやすいと思う。

現在続行中の開発でも、表題の「Tomcat + Axis2」で利用していて、クライアントには.NET(C#)で作成している。ただ、Axis2のバージョンが1.6.2の頃のものだし、TomcatもVer.6なので、そろそろ環境更新が必要になってきた。正直、機能的に問題は無いのだが、まぁ、新しい方が何かと良いだろうということと、顧客へのアピールにもなるし、良い機会だなぁと。

さて、気づけばAxis2もVer.1.7.2になっているらしいし、開発環境のEclipseもだいぶ更新されている。。。浦島太郎状態なので、少し調べてみた。

このサイトが一番わかりやすかったのだが、基本的に、以前とは変わっていない。しかし、躓く箇所はちゃんと(?)あって、「xmlschema-core-2.2.1.jar」がTomcatのライブラリに存在していないと、エラーとなってしまう。前述のサイトに記載があって、解決した。

というわけで、手順を画像付で記載しようと思う。

“Tomcat + Axis2 でSOAP! with Eclipse!”の続きを読む

.NET ClientでAxis2のWebServiceを利用するときの注意

Axis2でWebServiceを構築し、.NET Clientで利用しようとするときは、引数の書き方に注意しなければいけない。

ひょっとしたら、.NETどうしでもそうなのかもしれないが、未確認なので、一応限定して。

引数に文字列配列(String[ ])をおいた場合、配列と通常の文字列(String)の順番を混ぜて配列してはいけない。

どうやらシリアライズされたときに混ざってしまうためのようで、正しくパラメータを処理することができなくなる。具体的には、配列の中に単体の引数が混ざりこんでしまう。

よくよく考えてみると、シリアライズされる時点で、上記のようなことは起きえる気がする。さらに言えば、WebServiceの利用方法から考えて、あまり複数配列を渡すような仕様はよくないんだろうね。ま、そこのところはご愛敬w

これが原因でちょっと構築上悩んだので、誰かのお役に立てれば...w

ではでは。

Apache越し(ajp)のTomcat6上のAxis2へSSLで…

さて、かなりエントリー間隔が空いてるけど気にしな~い(w

今回は表題の件でハマったので、備忘録。

ApacheでHTTPやHTTPSの標準ポートでアクセスして、ある特定のディレクトリにアクセスするとTomcatへスローするのに、最近はよくAJPが使われているみたいですな。mod_jkなんかの流れを汲んでいるのだろうと思うけど、あってるかな?

この連携を、以下の環境下で行ったところ、SSLアクセスできずに大苦戦。解決方法はいつも通り単純明快。

  • CentOS 5.5
  • Apache 2.2.3
  • Tomcat 6.0.32
  • JDK 6 update 23
  • AJP 1.3
  • Axis2 1.5.4

手順は以下のとおり。

  1. ApacheにSSLでアクセスできるように構築。
  2. proxy_ajp.confに連携用の記述を追加
  3. HTTPにて、Apache経由でTomcatアクセスが可能なのを確認
  4. SSLにてApache経由でTomcat上のサンプルプログラムへアクセス可能なのを確認
  5. SSLにてApache経由でTomcat上のAxis2プログラムへアクセスし、WSDL表示でInternal Error…orz
  6. Tomcatログには「https is forbidden」とでる。

実は4と5の切り分けがなかなかできず(←俺のアホ…)そのため時間がかかってしまった。問題なのは、

Axis2上のWSDL表示でコケルこと

なのだ。その他サンプルプログラムが正常に動いているということは、問題はAxis2にある。

そこで、Axis2の設定を見直し、以下の記述を発見!

<!– The default configuration assumes that AxisServlet only receives requests
through HTTP. To allow HTTPS as well, configure a second AxisServletListener
with name=”https” and specify the port parameter on both receivers.
For more information, please have a look at the servlet transport documentation:
http://axis.apache.org/axis2/java/core/docs/servlet-transport.html –>
<transportReceiver name=”http” class=”org.apache.axis2.transport.http.AxisServletListener”/>

…これだ…ちゃんと書いてある…。

ということで、以下のようにして解決。

<transportReceiver name=”https” class=”org.apache.axis2.transport.http.AxisServletListener”/>

はぁぁ…ちかれたびぃ…

ではでは。

JDNIでPostgreSQLへConnectionPooling on Eclipse

いや、忘れてしまったので、まぢ備忘録として。

まず、環境は前回エントリーと同じ。

で、設定の仕方として、まずは作成したプロジェクトにあるWebContentの中のMETA-INFの中に「context.xml」を以下の内容で作成

<?xml version=’1.0′ encoding=’utf-8′?>
<Context docBase=”アプリ名称” path=”アプリへのパス” reloadable=”true” source=”適当に”>
<Resource name=”jdbc/postgres” auth=”Container”
type=”javax.sql.DataSource” driverClassName=”org.postgresql.Driver”
url=”jdbc:postgresql://DBサーバのIP:5432/DB名称”
username=”userid” password=”password” maxActive=”20″ maxIdle=”10″ maxWait=”-1″/>
</Context>

これは、おそらく新規で作らないといけないはず。

次に、WebContent内にある「web.xml」に以下の内容を追加する。

<resource-ref>
<description>PostgreSQL connection resource</description>
<res-ref-name>jdbc/postgres</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

これでOK。ソース内では以下のようにして指定する。

DataSource ds = (DataSource) new InitialContext()
.lookup(“java:/comp/env/jdbc/postgres”);

Connection con = ds.getConnection();

いやぁ、一度できてたのにハマったねw

ではでは~。

Eclipse on Windows7 + PostgreSQL の開発

いやぁ、ハマったね。久しぶりにハマったねw

まず、以下の環境にて開発をしていますた。

  • Windows7 64bit
  • Eclipse (Pleiades JAVA)
  • CentOS on VMware
  • PostgreSQL on CentOS

開発したいのは、Exlipse 上のTomcatでAxis2を用いてWebServiceを展開し、バックエンドのDBはVMware上、ClientはWindows上のC# で作成したSmartClientから利用する形。C#の開発環境はExpress Edition 2010です。で、wsdlはAxis2が作成してくれるので、それを利用して、簡単にメソッド呼び出ししましょうと考えたわけです。

さて、ここで問題は、PostgreSQLはVMware上のCentOSで動いているということ。さらに、VMwareのネットワークはBridgeです。ということは、すでに別サーバで動いているということですね。

まず、第一のハマり。

Visual C# Express Edition 2010では、「サービスの参照」というのがあります。これが、今まではWebサービスと同義だと思っていたのですが、どうも違うらしく、別途「Webサービスの参照」というのがあります。これにしないと、Tomcat側がwsdlのリクエストで

http://localhost:8080/MySVS/services/test?wsdl/$metadata not found

みたいなエラーはいて、C#上で正しくCallできるメソッドを作成してくれません。

これが、第一のハマり。

次に第二のハマり。

JDNIを正しく設定して、やっとことさPostgreSQLにアクセスできると思ったら、

Cannot create PoolableConnectionFactory

って言われて、アクセスできません。pg_hda.confやpostgresql.confなどをいじってみましたが、まったく効かず。さらに、同じWindows上のPgAdminからはアクセスできるし、Eclipse上のERMasterからもJDBCでアクセスできる…。

まったくもって理解不能と途方に暮れていた朝方6時ごろ(すでに3時間くらい悩んでましたw)、やっと解決。

原因は、Windowsのファイヤーウォール。Eclipseが外部からのアクセスをもらうことができなくなっていた。それを無効にしてやると…見事解決。なんだかねぇ…。

ただ、なんで同じEclipse上のERMasterがアクセスできていたかはちょっとわからん。とりあえず、アクセスできてよかったので、まずは、これで終わりw

ではでは。

CentOS5.5 on VMwareの落とし穴

VMware Server 2.0.2をWindows7にインストールして、CentOS5.5をゲストOSとして使おうと思った…のだが、これがハマった。

どうやっても、インストール途中でクラッシュ(>_<)エラーが出たと思ったら、そのままインストーラは何かしらのメッセージを出しながら再起動に入り、その後動かなくなる。

しかも、たちの悪いことに、VMの仮想領域自体がおかしくなって、以後インストーラすら立ち上がらない…。

マシンを変えたり、ホストOSを変えたりしたが、原因が分からないなぁと思っていたら、どうやらCentOS Extraのリポジトリを追加しているからだと判明…。

理由までは追っかけていないが、どうやらリポジトリがおかしいのか、うまく情報が取得できないらしい…。

あんだかねぇ~

ではでは。