質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

3042閲覧

c# SSL通信+ログイン+ダウンロード方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/08/29 03:36

編集2018/08/29 07:46

開発環境:Visual Studio 2017
使用OS:Windows 7

機器の管理画面(HTTPS)にアクセスし、ログインしてそのページ内にある.wriファイルをダウンロードするプログラムの作成を行っています。

仕様
・機器はローカルでの接続で自己証明書である為、セキュリティ警告が必ず出てしまいます。
(エラー内容:このWebサイトのセキュリティ証明書には問題があります )
・ログイン時のページはframeが使用されていてメインページにはID・PASSを入力するソースはありません。

考えた方法
①Webbrowserコントールを使用してログインまで行い、Cookieを取得してHttpWebRequest等に継承してファイルをダウンロード
②Webbrowserコントールを使用してログインまで行い、そのままダウンロード

問題点
・①も②も自己証明書の為、セキュリティ警告がポップアップで表示されること。
・WebbrowserコントロールからHttpWebRequestやWebClient等にCookieを継承する方法についてが調べても理解が不十分な点

現状
・現状は、sendkeyで"Y"を入力するように記述し対応していますが、プログラムとしておかしいと思うので別の方法を知りたい。
・継承方法については分からず、現状はCookieの取得まで出来ている状況。
取得したCookieは下記です。
(temp=temp; SessId=********************; PageSeed=*******************; )

質問内容
証明書エラーを突破してログインをして、ダウンロードまでする方法を教えていただきたいです。よろしくお願いいたします。

機器の管理画面ソース メインページ

<frame src="auth1.html" name="authFrm" id="authFrm" scrolling="no">

機器の管理画面ソース auth1.html

<div id="admin_reauth_text" style="visibility:hidden;"> 管理を始めるためにパスワードを入力してください: </div> <div id="username_line"> <div class="fieldName"> ユーザ名: </div> <div class="fieldValue"> <input type="text" id="userName" name="userName" value="" maxlength="128" autocomplete="off" style="width: 180px;"> </div> </div> <div class="vgap8"></div> <div id="password_line"> <div class="fieldName"> パスワード: </div> <div class="fieldValue"> <input type="password" name="pwd" value="" maxlength="63" autocomplete="off" style="width: 180px;"> </div> </div> <div class="vgap8"></div> <div id="language_line"> <div class="fieldName"> 言語: </div> <div class="fieldValue"> <select name="select2"> <option>日本語</option> </select> </div> </div> <div class="vgap15"></div> <div id="button_line"> <div class="fieldName"> &nbsp; </div> <div class="fieldValue"> <input type="submit" name="Submit" value="ログイン" class="button" > </div>

現状の自身のソースコード

namespace webbrowser { public partial class Form1 : Form { private const string strRegPath = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"; private Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(strRegPath, true); private string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"; private CookieContainer cc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { regKey.SetValue(strProcessName, 11001, Microsoft.Win32.RegistryValueKind.DWord); webBrowser1.ScriptErrorsSuppressed = false; webBrowser1.Visible = true; webBrowser1.Navigate("機器のURL");//機器にアクセス System.Threading.Thread.Sleep(2000);//2秒待つ SendKeys.Send("Y");//「Y」を押す(セキュリティエラーの苦肉の回避策) while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) { //無処理 System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(100); }//開くまで待つ HtmlWindow iframe = webBrowser1.Document.Window.Frames[0]; HtmlElementCollection elements = iframe.Document.All; HtmlElement id = elements.GetElementsByName("userName")[0]; HtmlElement pw = elements.GetElementsByName("pwd")[0]; id.InnerText = "ID";//ログインIDを入力 pw.InnerText = "password";//ログインPASSを入力 HtmlElement login = elements.GetElementsByName("Submit")[0]; login.InvokeMember("click");//ログインボタンを押す while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) { System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(100); }//開くまで待つ System.Threading.Thread.Sleep(2000);//2秒待つ CookieContainer cc = new CookieContainer(); cc.SetCookies(webBrowser1.Url, webBrowser1.Document.Cookie.Replace(";", ",")); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("ダウンロード先URL");//Cookieをセットしてダウンロード先にアクセス req.CookieContainer = cc; /*下記でエラーが出る。 System.Net.WebException: '接続が切断されました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。 内部例外 AuthenticationException: 検証プロシージャによると、リモート証明書は無効です。       上記で停まってしまい、証明書をスルーするコードを記入すると何も取得出来なくなります。 */ HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); String htmlSorce = sr.ReadToEnd(); Console.WriteLine(htmlSorce); sr.Close(); st.Close(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

その機器と内蔵Webアプリが十分に信頼できる場合に限ってのことですが、いったん手動でログイン画面まで進んだ状態でサーバー証明書(自己証明書)ファイルをダウンロードし、それを「信頼されたルート証明書」にインストールすることで、エラーを回避できると思います。

手順1)サーバー証明書のダウンロード方法
ブラウザから証明書ファイルをエクスポートするには

手順2)サーバー証明書のインストール方法
自己証明書のhttpsサイトで証明書エラーを非表示にする手順

ご参考になれば。

投稿2018/08/29 09:19

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/30 00:14

回答ありがとうございます。 機器が多くありまして都度都度その証明書が違う為、インストールしての証明書エラーを回避するのは難しい状況です。 その他に解決する方法があればご教授お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問