Chrome81へのバージョンアップでシステム管理者がやるべきこと。混合コンテンツ対応。

JavaScript

こんにちは。
さくさくTECHブロガーの「さく」です。


Chrome81のバージョンアップで、やっかいなバージョンアップがおこなわれます。
「混合コンテンツ」に対するChromeの動作が変更になるようです。


本記事では、Chrome81でエラー扱いとなるパターンの検証をおこないます。


環境情報


  • Chrome: 81.0.4044.83(Official Build)beta (64 ビット)

2020/03/29時点では、Chrome81ベータ版しか手に入りません。
なので、このバージョンで検証してみます。


ちなみに、Chrome81正式版のリリースは延期されているようです。
現時点では、延期したリリース日も未定です。


混合コンテンツとは


まず、混合コンテンツとは何か?という事ですが、簡単に説明すると“https化されたサイト内のhttpコンテンツ”です。


“混合コンテンツ”とは、閲覧ページが安全なHTTPS接続で読み込まれているにもかかわらず、そのHTTPSページに含まれる他のリソース(画像、動画、スタイルシート、スクリプトなど)が暗号化されていない、安全ではないHTTP接続で読み込まれている状態、つまりHTTPSページにHTTPサブリソースが混在している状態をいいます。


httpsで常時接続しているサイトにおいて、サイトの中で読み込まれている「画像」「CSS」「スクリプト」がhttpで接続されている場合に”混合コンテンツ”と判断されます。


何がブロックされるのかを検証


Chrome81では、本当に全てのhttpコンテンツがブロックされるのでしょうか?
検証してみました。


まず、混合コンテンツが発生するテストサイトを作成します。
以下のURLのサイトになります。
JavaScript・CSS・画像の3つについて、httpで読み込みをおこなっています。


さくさく TECH
混合コンテンツのテストサイト
https://sakusaku-techs.com/sample/mixed/mixed.html
JavaScript・CSS・画像、の3つについて、httpで読み込みをおこなっています

HTMLは以下になります。

<!DOCTYPE html>
<head>
  <title>混合コンテンツのテストサイト</title>
  <link rel="stylesheet" href="http://sakusaku-techs.com/sample/mixed/css/base.css" />
  <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22http%3A%2F%2Fsakusaku-techs.com%2Fsample%2Fmixed%2Fjs%2Fmixed.js%22%20type%3D%22text%2Fjavascript%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
</head>
<body>

混合コンテンツの試験サイト
<img src="http://sakusaku-techs.com/sample/mixed/image/images.png">
</body>
</html>

Chromeのディベロッパーツールでエラーを確認してみます。
CSSとJavaScriptはエラーが発生していますね。
エラーの内容は「Mixed Contents」です。



  • CSSのエラー
Mixed Content: The page at 'https://sakusaku-techs.com/sample/mixed/mixed.html' was loaded over HTTPS, but requested an insecure stylesheet 'http://sakusaku-techs.com/sample/mixed/css/base.css'. This request has been blocked; the content must be served over HTTPS.

  • JavaScriptのエラー
Mixed Content: The page at 'https://sakusaku-techs.com/sample/mixed/mixed.html' was loaded over HTTPS, but requested an insecure script 'http://sakusaku-techs.com/sample/mixed/js/mixed.js'. This request has been blocked; the content must be served over HTTPS.

かしかし、画像だけはエラーではワーニングになりました。

  • 画像のワーニング
Mixed Content: The page at 'https://sakusaku-techs.com/sample/mixed/mixed.html' was loaded over HTTPS, but requested an insecure image 'http://sakusaku-techs.com/sample/mixed/image/images.png'. This content should also be served over HTTPS.

外部コンテンツの読み込み部分は、CSSとJavaScriptはエラー、画像はワーニングになる、という事がわかりました。
画像はワーニングでブラウザ上に画像が表示されるのですが、これはもしかしたらChrome81のベータ版だからかもしれません

もしかしたら、正式版だとエラーになってしまうかも、です。


HTMLのhttp部分をhttpsに変更すれば、エラーは全て解消されました。


まとめ


混合コンテンツが原因でJavaScriptやCSSの読み込みがエラーとなった場合、そのサイトは”まったく動作しない”という可能性があります。
早急に対処した方がよさそうです。



VMWarePlayer上にCentOSをインストールして動かしてみる

Linux

今回は、VMWare上にCentOSをインストールして動かす方法を紹介します。


Linuxに限らず、普段はWindowsを使って作業している人が、他のOS環境も必要な場合があるかと思います。
そういう場合は、VMWareを使う方法が最も簡単です。

Windows上に仮想のHDを割り当てて、別OSの環境を構築できます。


しかも、別サーバに環境を移植したい場合は、VMWareのファイル一式をコピーすれば、簡単に引っ越しも可能です。


今回は、Winodows10上にVMWareをインストールして、CentOSを構築する方法を紹介します。


環境情報


  • ホストマシン:Windows10
  • VMWare:15.5.2 build-15785246
  • CentOS: release 8.1.1911

VMWareをダウンロードしてインストール


以下のURLからダウンロードします。



インストーラを起動すると、いきなり以下のポップアップウィンドウが表示されます。
どうやら、「Microsoft VC」をインストールする必要がありそうです。
とりあえず、ホストとなるインストール端末を再起動します。


VCのインストール

※筆者の場合は自動的にインストールされたようで、再起動してインストールを再開したら再度ダイアログが表示されることはなかったです。


インストール端末を再起動したら、再度インストーラを起動します。
インストールは、画面のウィザードに沿ってインストールしていけば大丈夫です。

最終的に以下のダイアログが表示されればインストール完了です。


VMWareのインストール完了

CentOSをダウンロードしてインストール


CentOSは、以下のURLからダウンロードします。


isoredirect.centos.org
CentOS
http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso
In order to conserve the limited bandwidth available, ISO images are not downloadable from mirror.centos.org

ミラーリングサイトを選択し、ISOファイルをダウンロードします。
7GBなので、結構時間がかかります
筆者は5Hくらいかかりました。


VMWare上にインストールするための準備として、まずはCentOSのISOファイルをマウントします。



マウントするとISOファイルがドライブとして認識されます。



この状態でVMWareを起動します。
VMWareが起動したら、「新規マシンの作成」を選択します。



「インストーラディスク」にマウントしたCentOSのドライブを選択し、「次へ」を押下します。



Linuxの情報を入力します。

ここでの「パスワード」は、rootユーザのパスワードになるので忘れないようにしましょう。



次に仮想マシンの名前を入力します。
自分で解りやすい名前をつければいいです。


CentOSのマシン名設定

次にディスク容量の指定をおこないます。
仮想マシンに割り当てる最大のディスクサイズになります。
筆者は、とりあえずデフォルトの20GByteにしました。



最後に確認画面が表示されます。
一応さらっと確認して、「完了」ボタンを押下します。


完了ボタンを押下したらインストールが開始します。
いきなり以下の確認ダイアログが表示されます。



ひとまず必要なさそうなので、「後で通知する」を選択してスキップします。


「Pane is dead」が表示されて画面が固まる


インストールを開始したと思ったら、何かVMWareのウィンドウが固まっているように見えます。
下の方には「Pane is dead」と表示されています。
日本語では、”画面(ペーン)が死んでいます”ですかね。。。


Pane is deadの表示

原因がよくわからないので、とりあえずもう1回同じ事をしてインストールしてみます。
しかし、それでも同じでした。。。


いろいろ調べたのですが、筆者の場合は以下の方法で回避できました。
とりあえず、VMWareで空のハードディスクを作ります



その後にインストールすると、ひとまずインストールが無事に完了しました。


以下に、空のハードディスクを作ってインストールする方法を紹介します。


空のハードディスクを作ってインストールを継続


インストールが進むと、インストールで使用する言語の選択ウィンドウが表示されます。
日本語を選択します。


CentOSの言語の選択

インストール概要ウィンドウが表示されるので、「インストールの開始」ボタンを押下します。



インストールが始まります。
空のハードディスクからインストールしたので、rootパスワードが設定されいないという表示になっています。
ひとまず、インストールが完了するのをまちます。


CentOSのインストール中

インストールは完了したのですが、設定に必要な項目が残っているので次に進めないです。
まずは、rootパスワードを設定します。


CentOSのrootパスワードの設定

rootのパスワードを設定したら、「設定完了」ボタンを押下します。


インストールが完了したら再起動ボタンを押下して、インストールを完了します。


CentOSの設定完了

再起動後の設定


再起動したら、初期セットアップウィンドウが表示されます。
まず、ライセンス情報を確認します。


CentOSのライセンス設定

「ライセンス契約に同意します」にチェックし、完了ボタンを押下したら完了です。

CentOSライセンスの同意

初期セットアップでの設定は完了です。
設定の完了ボタンを押下して、次に進みます。

最初にウェルカムウィンドウが表示されます。
「次へ」を押下します。

CentOSのインストール完了

位置情報サービスってやつがあるんですね。
これは必要なさそうなので、オフにして次へボタンを押下します。

CentOS位置情報の設定

オンラインアカウントへの接続も今回はおこまいません。
スキップします。

CentOSオンラインアカウント

ユーザ情報を入力します。

CentOSユーザ情報の入力

次にパスワードを入力します。
先ほど入力したユーザのパスワードになります。


これで完了です。
「CentOSを使い始める」を選択します。


先ほど作成したユーザが表示され、ログイン可能な状態になっています。
パスワードを入力して、ログインしてみます。


以下のようなウィンドウが表示されたインストール完了です。

おつかれさまでした。


CUIのウィンドウを開きたい場合は、「アクティビティ」→「端末」を選択します。





JavaMailを使ってメール送受信をおこなう方法

Java

今回は、JavaMailを使ってメールの受信、および送信おこなう方法を紹介します。


JavaMailとは、Javaに標準実装されているメール送信APIです。
簡単な実装で、メールの受信と送信をおこなうことができます。

今回は、Yahooメールを使用した実装サンプルを紹介します。


環境情報


環境の情報は以下になります。

今回は、Yahooメールを使ってメールの送受信をおこなってみます。

メールはYahooのフリーアカウントを使用します。

  • Java1.8.60
  • POP3:Yahooメール
  • SMTP:Yahooメール

Yahooメールを受信する


メール受信プログラムは以下になります。
YahooメールのPOP3サーバに接続し、受信ボックスに存在するメールを取得して標準出力をおこなっています。
22行目のIDとパスワードは、自分のYahooメールのIDをパスワードを使用してください。


import java.util.Properties;

import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Folder;
import javax.mail.Message;

public class MailReceive {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        try {
            // メール受信のプロパティ設定
            Properties props = new Properties();
            props.put("mail.pop3.host", "pop.mail.yahoo.co.jp");
            props.put("mail.pop3.port", "110");

            // メール受信フォルダをオープン
            Session session = Session.getDefaultInstance(props);
            Store store = session.getStore("pop3");
            store.connect("ID", "PW");
            Folder folderInbox = store.getFolder("INBOX");
            folderInbox.open(Folder.READ_ONLY);

            // メッセージ一覧を取得
            Message[] arrayMessages = folderInbox.getMessages();
            for (int lc = 0; lc < arrayMessages.length; lc++) {

                // メッセージの取得
                Message message = arrayMessages[lc];

                // 件名の取得と表示
                String subject = message.getSubject();
                System.out.print("件名:" + subject + "\r\n");

                // 本文の取得と表示
                String content = message.getContent().toString();
                System.out.print("本文:" + content + "\r\n");

                // 取得の最大件数は10件
                if (lc >= 10) {
                    break;
                }
                System.out.print("\r\n");
            }
        } catch (Exception e) {
            System.out.print("例外が発生!");
            e.printStackTrace();
        } finally {
        }
        System.out.print("end: main\r\n");
    }
}

Javaメールのメール受信をおこなえるようにするためには、Yahooメールでの設定変更が必要です。
Yahooメールの設定画面で、POPサーバについて、Yahoo公式サービス以外からのアクセスを許可します。
送信の場合はSMTPを使うので、POPとSMTPについては許可設定をしておく必要があります。


Yahooメール設定1
Yahooメール設定2

Yahooメールを送信する


次にメール送信です。
メールの送信元がYahooメールで、メールの送信先もYahooメールにしています。
自分自身にメールを送っています。


IDとパスワード、メールアドレスについては、実際に送信する情報にあわせて修正が必要になります。


import java.util.Properties;

import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Transport;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailSend {

    public static void main(String[] args){
        System.out.print("start: main\r\n");

        try {
            // メール送信のプロパティ設定
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.mail.yahoo.co.jp");
            props.put("mail.smtp.port", "587");
            props.put("mail.smtp.auth", "true");
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.ssl.trust", "*");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.connectiontimeout", "10000");
            props.put("mail.smtp.timeout", "10000");

            // セッションを作成する
            Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected 
                        PasswordAuthentication 
                        getPasswordAuthentication() {
                        return new 
                            PasswordAuthentication("ID", "PW");
                    }
                });

            // メールの送信先はYahooメール。送信元もYahooメール
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(
                "fromAddress", "fromName"));
            message.setReplyTo(new Address[]{
                new InternetAddress("toAddress")});
            message.setRecipients(Message.RecipientType.TO, 
                InternetAddress.parse("toAddress"));
            message.setSubject("テスト");
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText("テストメール。");

            // メールのメタ情報を作成
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            message.setHeader(
                "Content-Transfer-Encoding", "base64");

            // メールを送信する
            message.setContent(multipart);
            Transport.send(message);

        } catch (Exception e) {
            System.out.print("例外が発生!\r\n");
            e.printStackTrace();
        } finally {
        }
        System.out.print("end: main\r\n");
    }
}

筆者がちょっとはまったのが、以下の例外が発生した場合です。


javax.mail.NoSuchProviderException: No provider for smtp
        at javax.mail.Session.getProvider(Session.java:464)
        at javax.mail.Session.getTransport(Session.java:659)
        at javax.mail.Session.getTransport(Session.java:640)
        at javax.mail.Session.getTransport(Session.java:697)
        at javax.mail.Transport.send0(Transport.java:192)
        at javax.mail.Transport.send(Transport.java:124)
        at MailSend.main(MailSend.java:55)

“smtpのプロバイダーが存在しないよ”、と言われてしまっています。


この例外が発生する場合は、実行時のクラスパスに「mail.jar」が含まれていないときです。
「mail.jar」がない状態でビルドしてもビルドエラーにならないので、気が付きにくいかもしれません。


最後に


いかがでしたでしょうか?
Javaメールを使った、メール受信とメール送信の方法について紹介しました。


今回はYahooメールを使用したメール送受信方法を紹介しましたが、他メールサービスでも試してみたいと思います。(いつか。。。)
それではまた!