EnvCheckService.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Security.Cryptography;
  9. using System.Security.Cryptography.X509Certificates;
  10. using System.Security.Policy;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace EVCB_OCPP.WSServer.Service
  14. {
  15. public class EnvCheckService
  16. {
  17. public EnvCheckService(
  18. IConfiguration configuration,
  19. ILogger<EnvCheckService> logger)
  20. {
  21. this.configuration = configuration;
  22. this.logger = logger;
  23. CheckVariable();
  24. }
  25. private readonly IConfiguration configuration;
  26. private readonly ILogger<EnvCheckService> logger;
  27. private const string certPath = "/run/secrets";
  28. private const string certFileName1 = "cert1";
  29. private const string certFileName2 = "cert2";
  30. private const string certFileName3 = "licence";
  31. private const string key1 = "MYkGePq3yYw0w4FYKXSl2KP4erMVos+WtkZS+SKnD+E=/BhbnUz7mYSSzr8xfSFp3Q==";
  32. private const string key2 = "MIIBCgKCAQEAnsVwgEb9IVBDZrYE42KOMuI5RWAgnk4OsUWMu/UuHLbQyUxv9cNTSQqWnUgEU4J1Dys8cbRT+qsND9eJHFkxnGE1vpXO04ADDCTBBPn1b3J6Wj6lp5Wy/feREg6oiCGJB7nAK1SzmFLKQxKmJX09vbveE02JNvU3KqmFuOthuNqzCCjht8o58+68as3tldskrGy2OjQwBp5rPL0lT9x2tBStm6xiBKPmG87WBjBqPL9LwXI+lmGnfJOABmbddjMp746RCUjzTr/40tXSjL1LZKEA/4vv5qnqIWz+peHfyu8L+XjJjipQ8OKATB6vUWAVrDBH6uHPvpU3G5eNq/o5TQIDAQAB";
  33. //private const string key3 = "MIIEpAIBAAKCAQEAnsVwgEb9IVBDZrYE42KOMuI5RWAgnk4OsUWMu/UuHLbQyUxv9cNTSQqWnUgEU4J1Dys8cbRT+qsND9eJHFkxnGE1vpXO04ADDCTBBPn1b3J6Wj6lp5Wy/feREg6oiCGJB7nAK1SzmFLKQxKmJX09vbveE02JNvU3KqmFuOthuNqzCCjht8o58+68as3tldskrGy2OjQwBp5rPL0lT9x2tBStm6xiBKPmG87WBjBqPL9LwXI+lmGnfJOABmbddjMp746RCUjzTr/40tXSjL1LZKEA/4vv5qnqIWz+peHfyu8L+XjJjipQ8OKATB6vUWAVrDBH6uHPvpU3G5eNq/o5TQIDAQABAoIBAAmZ0NrA8C+iheDhItyJKiYjjekHDhHkkHjhxsfa5KXx3CBAEgkffZrOHBt4rmJKYj+/kpEhoW5oB4sssmrXbeuR6UkUEAS0GfsTAeUGJHRPzNxGK4g9wiwfW1NnNYO922ZvMhKstYuBfh+eMhPURfaCNMSgDKsZGvPmemKbQTaHUqaAFkmUCpvnd8DLTatj5dwmqW6ZFX8LA9nYE/6GqCyxjIdLLD0pX5QWqEugstB1fqtL4hX3AQKolL5CTrCKv8UOCufoBC2GwEVeYgu10puF5rw34zXKPNq3g0FpPyRk+hIfnWRfJlyP34DepNhpBSxkfbB3wNEJJvR9dGOP9JUCgYEAzmg960uy3mKXCxAnTf1zrrEIHWIdYZIunQ94wpfFnbQ4YsjhcvVYuqML+P4VQjWp5zytIHog5GTZahG5TgsvlFhqXjKCi1mcJ3VkBgwlTrc42TpzsWFtoOAnsjCMVBwj1eRpLXRehZC9plfZUDlLhqDXa17Pz73B1w2Cj0tcUHcCgYEAxOsw3u4rXu4qC2LZ4kee3o/u/ewlRS1IJjt7sQlwqFW6flFbyqtzbkziXLj5ePVMnYHT0jfUkBUa07BlJlPcGFk0WbrfuQ6YjwP/0nBz68uKgSpHX2viY62kQkHAveXz0CQRYpwebpFJmmgmQPz1QYApP3LZQ9ghmnlqqGWiGVsCgYEAjqVkBXTvTNl94Vtsjm2WwSf/n67q9z97j3fd0T3qiK7AOSTzCeudQn7kC1QthPBpVzGLxGIi0TURPEi7c8AvRapE+IyXw45OaMasNbG3JsthMl8/DVtz1DaVuIPst0QrT+rm9U7y9AOvzYHw4Yx3Mbd+qOmBXOSbTfA8RqOiTMkCgYAnpZ7KU7OhwlvuvPFXcMoYz2vz7fa3Dd3n7LQDuf3XtqL8yc6saIauH4a32npIE0NgtwH54knG1Kj5FBvZcqrusA8tPcXLkZe/u7NnIEMGp410YhnKqYMERLK8sFZpJYJIVuq1Ku+pnVDvaKbDEOskS/SCFNKPqVVir618yDGx3wKBgQDI6aMMQ8o6ALi4HGandjlt70sSJtVq2+TLnclX3r6Er3zKfwMu8M4WRmMVrtp79Si471DoJ2f4xQRTR3IaySZ0x2Fxxt9x/t6UjJPX54x0hjI+WVt0N5BwEzhQ357H0HlzpL/u0mIDcFrjjpsp2MCcggV3TqwXZ6kyaUf9uzo1OA==";
  34. public void CheckVariable()
  35. {
  36. var connectionSectionString = JsonConvert.SerializeObject(configuration.GetSection("ConnectionStrings").AsEnumerable());
  37. var dbSn = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(connectionSectionString)));
  38. if (!CheckIsInDocker() ||
  39. CheckIsInAzureAppService() ||
  40. CheckVariable(dbSn, key1, key2)
  41. )
  42. {
  43. return;
  44. }
  45. Console.WriteLine($"Error:{dbSn}");
  46. Environment.Exit(401);
  47. }
  48. private static bool CheckVariable(string dbSn ,string key1, string key2)
  49. {
  50. if (!File.Exists(Path.Combine(certPath, certFileName1)) ||
  51. !File.Exists(Path.Combine(certPath, certFileName2)) )
  52. {
  53. return false;
  54. }
  55. var cert1 = File.ReadAllText(Path.Combine(certPath, certFileName1));
  56. var cert2 = File.ReadAllText(Path.Combine(certPath, certFileName2));
  57. string keySn = GetSn(cert1, key1);
  58. //if (string.IsNullOrEmpty(dbSn) ||
  59. // !keySn.StartsWith(dbSn))
  60. //{
  61. // return false;
  62. //}
  63. return CheckSn(keySn, cert2, key2);
  64. }
  65. private static string GetSn(string cert, string key)
  66. {
  67. var aesDecrept = Aes.Create();
  68. (byte[] aesKey, byte[] aesIv) = GetAesKey(key);
  69. aesDecrept.Key = aesKey;
  70. aesDecrept.IV = aesIv;
  71. var toDecryptStream = new MemoryStream(Convert.FromBase64String(cert));
  72. CryptoStream deCryptoStream = new CryptoStream(
  73. toDecryptStream,
  74. aesDecrept.CreateDecryptor(),
  75. CryptoStreamMode.Read);
  76. StreamReader sr = new StreamReader(deCryptoStream);
  77. var deceypedString = sr.ReadToEnd();
  78. return deceypedString;
  79. }
  80. private static bool CheckSn(string sn, string cert2, string key)
  81. {
  82. var encryptor = new System.Security.Cryptography.RSACryptoServiceProvider();
  83. encryptor.ImportRSAPublicKey(Convert.FromBase64String(key), out var bytesRead);
  84. var isValid = encryptor.VerifyData(Encoding.UTF8.GetBytes(sn), SHA1.Create(), Convert.FromBase64String(cert2));
  85. return isValid;
  86. }
  87. private static (byte[] key, byte[] iv) GetAesKey(string key)
  88. {
  89. var keyString = key.Substring(0, 44);
  90. var ivString = key.Substring(44);
  91. return (Convert.FromBase64String(keyString), Convert.FromBase64String(ivString));
  92. }
  93. private bool CheckEnv()
  94. {
  95. return !CheckIsInDocker() || CheckIsInAzureAppService();
  96. }
  97. private bool CheckIsInAzureAppService()
  98. {
  99. return !String.IsNullOrEmpty(configuration["WEBSITE_SITE_NAME"]);
  100. }
  101. private bool CheckIsInDocker()
  102. {
  103. return !String.IsNullOrEmpty(configuration["RUNNING_IN_CONTAINER"]);
  104. }
  105. }
  106. }