Program.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using System;
  2. using System.Net;
  3. using System.Net.Security;
  4. using System.Net.Sockets;
  5. using System.Security.Cryptography.X509Certificates;
  6. using System.Threading.Tasks;
  7. namespace PixivLocalSniCover
  8. {
  9. internal static class Program
  10. {
  11. private static X509Certificate _serverCert;
  12. [STAThread]
  13. private static void Main()
  14. {
  15. _serverCert = new X509Certificate2(Properties.Resources.server, "server");
  16. StartMain();
  17. StartLive();
  18. Console.WriteLine("Press ENTER to exit");
  19. Console.ReadLine();
  20. }
  21. private static void StartMain()
  22. {
  23. var svc = new TcpListener(IPAddress.Loopback, 443);
  24. Console.WriteLine($"Listening on {svc.LocalEndpoint} for Main");
  25. svc.Start();
  26. svc.BeginAcceptTcpClient(HandleRequestMain, svc);
  27. }
  28. private static void HandleRequestMain(IAsyncResult ar)
  29. {
  30. var svc = (TcpListener)ar.AsyncState;
  31. svc.BeginAcceptTcpClient(HandleRequestMain, svc);
  32. HandleInternal(ar, svc, CreateConnectionMain);
  33. }
  34. private static void StartLive()
  35. {
  36. var svc = new TcpListener(IPAddress.Parse("127.0.0.2"), 443);
  37. Console.WriteLine($"Listening on {svc.LocalEndpoint} for Live");
  38. svc.Start();
  39. svc.BeginAcceptTcpClient(HandleRequestLive, svc);
  40. }
  41. private static void HandleRequestLive(IAsyncResult ar)
  42. {
  43. var svc = (TcpListener)ar.AsyncState;
  44. svc.BeginAcceptTcpClient(HandleRequestLive, svc);
  45. HandleInternal(ar, svc, CreateConnectionLive);
  46. }
  47. private static void HandleInternal(IAsyncResult ar, TcpListener svc, Func<SslStream> provider)
  48. {
  49. using (var client = svc.EndAcceptTcpClient(ar))
  50. {
  51. var clientRemoteEndPoint = client.Client.RemoteEndPoint;
  52. Console.WriteLine($"Accept from {clientRemoteEndPoint}");
  53. var clientStream = client.GetStream();
  54. var clientSsl = new SslStream(clientStream, false);
  55. clientSsl.AuthenticateAsServer(_serverCert);
  56. var conn = provider();
  57. if (null != conn)
  58. {
  59. using (conn)
  60. {
  61. var send = Task.Factory.StartNew(() =>
  62. {
  63. try
  64. {
  65. clientSsl.CopyTo(conn);
  66. }
  67. catch
  68. {
  69. Console.WriteLine($"Closed by local {clientRemoteEndPoint}");
  70. }
  71. });
  72. var recv = Task.Factory.StartNew(() =>
  73. {
  74. try
  75. {
  76. conn.CopyTo(clientSsl);
  77. }
  78. catch
  79. {
  80. Console.WriteLine($"Closed by remote {clientRemoteEndPoint}");
  81. }
  82. });
  83. Task.WaitAny(send, recv);
  84. conn.Close();
  85. }
  86. }
  87. client.Close();
  88. }
  89. }
  90. private static SslStream CreateConnectionLive()
  91. {
  92. const string IpLive = "210.140.170.179";
  93. const string certSubject = "CN=*.pixivsketch.net, OU=Domain Control Validated";
  94. const string certSn = "255CFC7D0A8E016C94C655C0";
  95. const string certT = "5942DD91CEC00247B492EA79CE9CA13F1DF2FADB";
  96. try
  97. {
  98. var cl = new TcpClient(IpLive, 443);
  99. var networkStream = cl.GetStream();
  100. var ssl = new SslStream(networkStream, false, (sender, certificate, chain, errors) =>
  101. {
  102. var cert = (X509Certificate2)certificate;
  103. return cert.Subject == certSubject
  104. && cert.SerialNumber == certSn
  105. && cert.Thumbprint == certT;
  106. });
  107. ssl.AuthenticateAsClient("");
  108. return ssl;
  109. }
  110. catch (Exception e)
  111. {
  112. Console.WriteLine(e);
  113. return null;
  114. }
  115. }
  116. private static SslStream CreateConnectionMain()
  117. {
  118. const string ipMain = "210.140.131.224";
  119. const string certSubject = "CN=*.pixiv.net, O=pixiv Inc., OU=Development department, L=Shibuya-ku, S=Tokyo, C=JP";
  120. const string certSn = "73367180A6430D2C1CDF8076";
  121. const string certT = "790E5A115639C72B371B17C2C980CF31310FABA7";
  122. try
  123. {
  124. var cl = new TcpClient(ipMain, 443);
  125. var networkStream = cl.GetStream();
  126. var ssl = new SslStream(networkStream, false, (sender, certificate, chain, errors) =>
  127. {
  128. var cert = (X509Certificate2)certificate;
  129. return cert.Subject == certSubject
  130. && cert.SerialNumber == certSn
  131. && cert.Thumbprint == certT;
  132. });
  133. ssl.AuthenticateAsClient("");
  134. return ssl;
  135. }
  136. catch (Exception e)
  137. {
  138. Console.WriteLine(e);
  139. return null;
  140. }
  141. }
  142. }
  143. }