tls_test.go 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. package scenarios
  2. import (
  3. "crypto/x509"
  4. "runtime"
  5. "testing"
  6. "time"
  7. "github.com/xtls/xray-core/app/proxyman"
  8. "github.com/xtls/xray-core/common"
  9. "github.com/xtls/xray-core/common/net"
  10. "github.com/xtls/xray-core/common/protocol"
  11. "github.com/xtls/xray-core/common/protocol/tls/cert"
  12. "github.com/xtls/xray-core/common/serial"
  13. "github.com/xtls/xray-core/common/uuid"
  14. core "github.com/xtls/xray-core/core"
  15. "github.com/xtls/xray-core/proxy/dokodemo"
  16. "github.com/xtls/xray-core/proxy/freedom"
  17. "github.com/xtls/xray-core/proxy/vmess"
  18. "github.com/xtls/xray-core/proxy/vmess/inbound"
  19. "github.com/xtls/xray-core/proxy/vmess/outbound"
  20. "github.com/xtls/xray-core/testing/servers/tcp"
  21. "github.com/xtls/xray-core/testing/servers/udp"
  22. "github.com/xtls/xray-core/transport/internet"
  23. "github.com/xtls/xray-core/transport/internet/grpc"
  24. "github.com/xtls/xray-core/transport/internet/tls"
  25. "github.com/xtls/xray-core/transport/internet/websocket"
  26. "golang.org/x/sync/errgroup"
  27. )
  28. func TestSimpleTLSConnection(t *testing.T) {
  29. tcpServer := tcp.Server{
  30. MsgProcessor: xor,
  31. }
  32. dest, err := tcpServer.Start()
  33. common.Must(err)
  34. defer tcpServer.Close()
  35. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  36. userID := protocol.NewID(uuid.New())
  37. serverPort := tcp.PickPort()
  38. serverConfig := &core.Config{
  39. Inbound: []*core.InboundHandlerConfig{
  40. {
  41. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  42. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  43. Listen: net.NewIPOrDomain(net.LocalHostIP),
  44. StreamSettings: &internet.StreamConfig{
  45. SecurityType: serial.GetMessageType(&tls.Config{}),
  46. SecuritySettings: []*serial.TypedMessage{
  47. serial.ToTypedMessage(&tls.Config{
  48. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  49. }),
  50. },
  51. },
  52. }),
  53. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  54. User: []*protocol.User{
  55. {
  56. Account: serial.ToTypedMessage(&vmess.Account{
  57. Id: userID.String(),
  58. }),
  59. },
  60. },
  61. }),
  62. },
  63. },
  64. Outbound: []*core.OutboundHandlerConfig{
  65. {
  66. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  67. },
  68. },
  69. }
  70. clientPort := tcp.PickPort()
  71. clientConfig := &core.Config{
  72. Inbound: []*core.InboundHandlerConfig{
  73. {
  74. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  75. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  76. Listen: net.NewIPOrDomain(net.LocalHostIP),
  77. }),
  78. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  79. Address: net.NewIPOrDomain(dest.Address),
  80. Port: uint32(dest.Port),
  81. Networks: []net.Network{net.Network_TCP},
  82. }),
  83. },
  84. },
  85. Outbound: []*core.OutboundHandlerConfig{
  86. {
  87. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  88. Receiver: &protocol.ServerEndpoint{
  89. Address: net.NewIPOrDomain(net.LocalHostIP),
  90. Port: uint32(serverPort),
  91. User: &protocol.User{
  92. Account: serial.ToTypedMessage(&vmess.Account{
  93. Id: userID.String(),
  94. }),
  95. },
  96. },
  97. }),
  98. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  99. StreamSettings: &internet.StreamConfig{
  100. SecurityType: serial.GetMessageType(&tls.Config{}),
  101. SecuritySettings: []*serial.TypedMessage{
  102. serial.ToTypedMessage(&tls.Config{
  103. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  104. }),
  105. },
  106. },
  107. }),
  108. },
  109. },
  110. }
  111. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  112. common.Must(err)
  113. defer CloseAllServers(servers)
  114. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  115. t.Fatal(err)
  116. }
  117. }
  118. func TestAutoIssuingCertificate(t *testing.T) {
  119. if runtime.GOOS == "windows" {
  120. // Not supported on Windows yet.
  121. return
  122. }
  123. if runtime.GOARCH == "arm64" {
  124. return
  125. }
  126. tcpServer := tcp.Server{
  127. MsgProcessor: xor,
  128. }
  129. dest, err := tcpServer.Start()
  130. common.Must(err)
  131. defer tcpServer.Close()
  132. caCert, err := cert.Generate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment|x509.KeyUsageCertSign))
  133. common.Must(err)
  134. certPEM, keyPEM := caCert.ToPEM()
  135. userID := protocol.NewID(uuid.New())
  136. serverPort := tcp.PickPort()
  137. serverConfig := &core.Config{
  138. Inbound: []*core.InboundHandlerConfig{
  139. {
  140. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  141. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  142. Listen: net.NewIPOrDomain(net.LocalHostIP),
  143. StreamSettings: &internet.StreamConfig{
  144. SecurityType: serial.GetMessageType(&tls.Config{}),
  145. SecuritySettings: []*serial.TypedMessage{
  146. serial.ToTypedMessage(&tls.Config{
  147. Certificate: []*tls.Certificate{{
  148. Certificate: certPEM,
  149. Key: keyPEM,
  150. Usage: tls.Certificate_AUTHORITY_ISSUE,
  151. }},
  152. }),
  153. },
  154. },
  155. }),
  156. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  157. User: []*protocol.User{
  158. {
  159. Account: serial.ToTypedMessage(&vmess.Account{
  160. Id: userID.String(),
  161. }),
  162. },
  163. },
  164. }),
  165. },
  166. },
  167. Outbound: []*core.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  170. },
  171. },
  172. }
  173. clientPort := tcp.PickPort()
  174. clientConfig := &core.Config{
  175. Inbound: []*core.InboundHandlerConfig{
  176. {
  177. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  178. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  179. Listen: net.NewIPOrDomain(net.LocalHostIP),
  180. }),
  181. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  182. Address: net.NewIPOrDomain(dest.Address),
  183. Port: uint32(dest.Port),
  184. Networks: []net.Network{net.Network_TCP},
  185. }),
  186. },
  187. },
  188. Outbound: []*core.OutboundHandlerConfig{
  189. {
  190. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  191. Receiver: &protocol.ServerEndpoint{
  192. Address: net.NewIPOrDomain(net.LocalHostIP),
  193. Port: uint32(serverPort),
  194. User: &protocol.User{
  195. Account: serial.ToTypedMessage(&vmess.Account{
  196. Id: userID.String(),
  197. }),
  198. },
  199. },
  200. }),
  201. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  202. StreamSettings: &internet.StreamConfig{
  203. SecurityType: serial.GetMessageType(&tls.Config{}),
  204. SecuritySettings: []*serial.TypedMessage{
  205. serial.ToTypedMessage(&tls.Config{
  206. ServerName: "example.com",
  207. Certificate: []*tls.Certificate{{
  208. Certificate: certPEM,
  209. Usage: tls.Certificate_AUTHORITY_VERIFY,
  210. }},
  211. }),
  212. },
  213. },
  214. }),
  215. },
  216. },
  217. }
  218. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  219. common.Must(err)
  220. defer CloseAllServers(servers)
  221. for range 3 {
  222. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  223. t.Error(err)
  224. }
  225. }
  226. }
  227. func TestTLSOverKCP(t *testing.T) {
  228. tcpServer := tcp.Server{
  229. MsgProcessor: xor,
  230. }
  231. dest, err := tcpServer.Start()
  232. common.Must(err)
  233. defer tcpServer.Close()
  234. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  235. userID := protocol.NewID(uuid.New())
  236. serverPort := udp.PickPort()
  237. serverConfig := &core.Config{
  238. Inbound: []*core.InboundHandlerConfig{
  239. {
  240. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  241. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  242. Listen: net.NewIPOrDomain(net.LocalHostIP),
  243. StreamSettings: &internet.StreamConfig{
  244. ProtocolName: "mkcp",
  245. SecurityType: serial.GetMessageType(&tls.Config{}),
  246. SecuritySettings: []*serial.TypedMessage{
  247. serial.ToTypedMessage(&tls.Config{
  248. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  249. }),
  250. },
  251. },
  252. }),
  253. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  254. User: []*protocol.User{
  255. {
  256. Account: serial.ToTypedMessage(&vmess.Account{
  257. Id: userID.String(),
  258. }),
  259. },
  260. },
  261. }),
  262. },
  263. },
  264. Outbound: []*core.OutboundHandlerConfig{
  265. {
  266. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  267. },
  268. },
  269. }
  270. clientPort := tcp.PickPort()
  271. clientConfig := &core.Config{
  272. Inbound: []*core.InboundHandlerConfig{
  273. {
  274. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  275. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  276. Listen: net.NewIPOrDomain(net.LocalHostIP),
  277. }),
  278. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  279. Address: net.NewIPOrDomain(dest.Address),
  280. Port: uint32(dest.Port),
  281. Networks: []net.Network{net.Network_TCP},
  282. }),
  283. },
  284. },
  285. Outbound: []*core.OutboundHandlerConfig{
  286. {
  287. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  288. Receiver: &protocol.ServerEndpoint{
  289. Address: net.NewIPOrDomain(net.LocalHostIP),
  290. Port: uint32(serverPort),
  291. User: &protocol.User{
  292. Account: serial.ToTypedMessage(&vmess.Account{
  293. Id: userID.String(),
  294. }),
  295. },
  296. },
  297. }),
  298. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  299. StreamSettings: &internet.StreamConfig{
  300. ProtocolName: "mkcp",
  301. SecurityType: serial.GetMessageType(&tls.Config{}),
  302. SecuritySettings: []*serial.TypedMessage{
  303. serial.ToTypedMessage(&tls.Config{
  304. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  305. }),
  306. },
  307. },
  308. }),
  309. },
  310. },
  311. }
  312. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  313. common.Must(err)
  314. defer CloseAllServers(servers)
  315. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  316. t.Error(err)
  317. }
  318. }
  319. func TestTLSOverWebSocket(t *testing.T) {
  320. tcpServer := tcp.Server{
  321. MsgProcessor: xor,
  322. }
  323. dest, err := tcpServer.Start()
  324. common.Must(err)
  325. defer tcpServer.Close()
  326. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  327. userID := protocol.NewID(uuid.New())
  328. serverPort := tcp.PickPort()
  329. serverConfig := &core.Config{
  330. Inbound: []*core.InboundHandlerConfig{
  331. {
  332. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  333. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  334. Listen: net.NewIPOrDomain(net.LocalHostIP),
  335. StreamSettings: &internet.StreamConfig{
  336. ProtocolName: "websocket",
  337. SecurityType: serial.GetMessageType(&tls.Config{}),
  338. SecuritySettings: []*serial.TypedMessage{
  339. serial.ToTypedMessage(&tls.Config{
  340. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  341. }),
  342. },
  343. },
  344. }),
  345. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  346. User: []*protocol.User{
  347. {
  348. Account: serial.ToTypedMessage(&vmess.Account{
  349. Id: userID.String(),
  350. }),
  351. },
  352. },
  353. }),
  354. },
  355. },
  356. Outbound: []*core.OutboundHandlerConfig{
  357. {
  358. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  359. },
  360. },
  361. }
  362. clientPort := tcp.PickPort()
  363. clientConfig := &core.Config{
  364. Inbound: []*core.InboundHandlerConfig{
  365. {
  366. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  367. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  368. Listen: net.NewIPOrDomain(net.LocalHostIP),
  369. }),
  370. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  371. Address: net.NewIPOrDomain(dest.Address),
  372. Port: uint32(dest.Port),
  373. Networks: []net.Network{net.Network_TCP},
  374. }),
  375. },
  376. },
  377. Outbound: []*core.OutboundHandlerConfig{
  378. {
  379. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  380. Receiver: &protocol.ServerEndpoint{
  381. Address: net.NewIPOrDomain(net.LocalHostIP),
  382. Port: uint32(serverPort),
  383. User: &protocol.User{
  384. Account: serial.ToTypedMessage(&vmess.Account{
  385. Id: userID.String(),
  386. }),
  387. },
  388. },
  389. }),
  390. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  391. StreamSettings: &internet.StreamConfig{
  392. ProtocolName: "websocket",
  393. TransportSettings: []*internet.TransportConfig{
  394. {
  395. ProtocolName: "websocket",
  396. Settings: serial.ToTypedMessage(&websocket.Config{}),
  397. },
  398. },
  399. SecurityType: serial.GetMessageType(&tls.Config{}),
  400. SecuritySettings: []*serial.TypedMessage{
  401. serial.ToTypedMessage(&tls.Config{
  402. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  403. }),
  404. },
  405. },
  406. }),
  407. },
  408. },
  409. }
  410. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  411. common.Must(err)
  412. defer CloseAllServers(servers)
  413. var errg errgroup.Group
  414. for range 3 {
  415. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
  416. }
  417. if err := errg.Wait(); err != nil {
  418. t.Error(err)
  419. }
  420. }
  421. func TestGRPC(t *testing.T) {
  422. tcpServer := tcp.Server{
  423. MsgProcessor: xor,
  424. }
  425. dest, err := tcpServer.Start()
  426. common.Must(err)
  427. defer tcpServer.Close()
  428. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  429. userID := protocol.NewID(uuid.New())
  430. serverPort := tcp.PickPort()
  431. serverConfig := &core.Config{
  432. Inbound: []*core.InboundHandlerConfig{
  433. {
  434. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  435. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  436. Listen: net.NewIPOrDomain(net.LocalHostIP),
  437. StreamSettings: &internet.StreamConfig{
  438. ProtocolName: "grpc",
  439. TransportSettings: []*internet.TransportConfig{
  440. {
  441. ProtocolName: "grpc",
  442. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  443. },
  444. },
  445. SecurityType: serial.GetMessageType(&tls.Config{}),
  446. SecuritySettings: []*serial.TypedMessage{
  447. serial.ToTypedMessage(&tls.Config{
  448. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  449. }),
  450. },
  451. },
  452. }),
  453. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  454. User: []*protocol.User{
  455. {
  456. Account: serial.ToTypedMessage(&vmess.Account{
  457. Id: userID.String(),
  458. }),
  459. },
  460. },
  461. }),
  462. },
  463. },
  464. Outbound: []*core.OutboundHandlerConfig{
  465. {
  466. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  467. },
  468. },
  469. }
  470. clientPort := tcp.PickPort()
  471. clientConfig := &core.Config{
  472. Inbound: []*core.InboundHandlerConfig{
  473. {
  474. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  475. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  476. Listen: net.NewIPOrDomain(net.LocalHostIP),
  477. }),
  478. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  479. Address: net.NewIPOrDomain(dest.Address),
  480. Port: uint32(dest.Port),
  481. Networks: []net.Network{net.Network_TCP},
  482. }),
  483. },
  484. },
  485. Outbound: []*core.OutboundHandlerConfig{
  486. {
  487. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  488. Receiver: &protocol.ServerEndpoint{
  489. Address: net.NewIPOrDomain(net.LocalHostIP),
  490. Port: uint32(serverPort),
  491. User: &protocol.User{
  492. Account: serial.ToTypedMessage(&vmess.Account{
  493. Id: userID.String(),
  494. }),
  495. },
  496. },
  497. }),
  498. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  499. StreamSettings: &internet.StreamConfig{
  500. ProtocolName: "grpc",
  501. TransportSettings: []*internet.TransportConfig{
  502. {
  503. ProtocolName: "grpc",
  504. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  505. },
  506. },
  507. SecurityType: serial.GetMessageType(&tls.Config{}),
  508. SecuritySettings: []*serial.TypedMessage{
  509. serial.ToTypedMessage(&tls.Config{
  510. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  511. }),
  512. },
  513. },
  514. }),
  515. },
  516. },
  517. }
  518. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  519. common.Must(err)
  520. defer CloseAllServers(servers)
  521. var errg errgroup.Group
  522. for range 3 {
  523. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  524. }
  525. if err := errg.Wait(); err != nil {
  526. t.Error(err)
  527. }
  528. }
  529. func TestGRPCMultiMode(t *testing.T) {
  530. tcpServer := tcp.Server{
  531. MsgProcessor: xor,
  532. }
  533. dest, err := tcpServer.Start()
  534. common.Must(err)
  535. defer tcpServer.Close()
  536. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  537. userID := protocol.NewID(uuid.New())
  538. serverPort := tcp.PickPort()
  539. serverConfig := &core.Config{
  540. Inbound: []*core.InboundHandlerConfig{
  541. {
  542. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  543. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  544. Listen: net.NewIPOrDomain(net.LocalHostIP),
  545. StreamSettings: &internet.StreamConfig{
  546. ProtocolName: "grpc",
  547. TransportSettings: []*internet.TransportConfig{
  548. {
  549. ProtocolName: "grpc",
  550. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉"}),
  551. },
  552. },
  553. SecurityType: serial.GetMessageType(&tls.Config{}),
  554. SecuritySettings: []*serial.TypedMessage{
  555. serial.ToTypedMessage(&tls.Config{
  556. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  557. }),
  558. },
  559. },
  560. }),
  561. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  562. User: []*protocol.User{
  563. {
  564. Account: serial.ToTypedMessage(&vmess.Account{
  565. Id: userID.String(),
  566. }),
  567. },
  568. },
  569. }),
  570. },
  571. },
  572. Outbound: []*core.OutboundHandlerConfig{
  573. {
  574. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  575. },
  576. },
  577. }
  578. clientPort := tcp.PickPort()
  579. clientConfig := &core.Config{
  580. Inbound: []*core.InboundHandlerConfig{
  581. {
  582. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  583. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  584. Listen: net.NewIPOrDomain(net.LocalHostIP),
  585. }),
  586. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  587. Address: net.NewIPOrDomain(dest.Address),
  588. Port: uint32(dest.Port),
  589. Networks: []net.Network{net.Network_TCP},
  590. }),
  591. },
  592. },
  593. Outbound: []*core.OutboundHandlerConfig{
  594. {
  595. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  596. Receiver: &protocol.ServerEndpoint{
  597. Address: net.NewIPOrDomain(net.LocalHostIP),
  598. Port: uint32(serverPort),
  599. User: &protocol.User{
  600. Account: serial.ToTypedMessage(&vmess.Account{
  601. Id: userID.String(),
  602. }),
  603. },
  604. },
  605. }),
  606. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  607. StreamSettings: &internet.StreamConfig{
  608. ProtocolName: "grpc",
  609. TransportSettings: []*internet.TransportConfig{
  610. {
  611. ProtocolName: "grpc",
  612. Settings: serial.ToTypedMessage(&grpc.Config{ServiceName: "🍉", MultiMode: true}),
  613. },
  614. },
  615. SecurityType: serial.GetMessageType(&tls.Config{}),
  616. SecuritySettings: []*serial.TypedMessage{
  617. serial.ToTypedMessage(&tls.Config{
  618. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  619. }),
  620. },
  621. },
  622. }),
  623. },
  624. },
  625. }
  626. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  627. common.Must(err)
  628. defer CloseAllServers(servers)
  629. var errg errgroup.Group
  630. for range 3 {
  631. errg.Go(testTCPConn(clientPort, 1024*10240, time.Second*40))
  632. }
  633. if err := errg.Wait(); err != nil {
  634. t.Error(err)
  635. }
  636. }
  637. func TestSimpleTLSConnectionPinned(t *testing.T) {
  638. tcpServer := tcp.Server{
  639. MsgProcessor: xor,
  640. }
  641. dest, err := tcpServer.Start()
  642. common.Must(err)
  643. defer tcpServer.Close()
  644. certificateDer, _ := cert.MustGenerate(nil)
  645. certificate := tls.ParseCertificate(certificateDer)
  646. certHash := tls.GenerateCertHash(certificateDer.Certificate)
  647. userID := protocol.NewID(uuid.New())
  648. serverPort := tcp.PickPort()
  649. serverConfig := &core.Config{
  650. Inbound: []*core.InboundHandlerConfig{
  651. {
  652. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  653. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  654. Listen: net.NewIPOrDomain(net.LocalHostIP),
  655. StreamSettings: &internet.StreamConfig{
  656. SecurityType: serial.GetMessageType(&tls.Config{}),
  657. SecuritySettings: []*serial.TypedMessage{
  658. serial.ToTypedMessage(&tls.Config{
  659. Certificate: []*tls.Certificate{certificate},
  660. }),
  661. },
  662. },
  663. }),
  664. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  665. User: []*protocol.User{
  666. {
  667. Account: serial.ToTypedMessage(&vmess.Account{
  668. Id: userID.String(),
  669. }),
  670. },
  671. },
  672. }),
  673. },
  674. },
  675. Outbound: []*core.OutboundHandlerConfig{
  676. {
  677. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  678. },
  679. },
  680. }
  681. clientPort := tcp.PickPort()
  682. clientConfig := &core.Config{
  683. Inbound: []*core.InboundHandlerConfig{
  684. {
  685. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  686. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  687. Listen: net.NewIPOrDomain(net.LocalHostIP),
  688. }),
  689. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  690. Address: net.NewIPOrDomain(dest.Address),
  691. Port: uint32(dest.Port),
  692. Networks: []net.Network{net.Network_TCP},
  693. }),
  694. },
  695. },
  696. Outbound: []*core.OutboundHandlerConfig{
  697. {
  698. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  699. Receiver: &protocol.ServerEndpoint{
  700. Address: net.NewIPOrDomain(net.LocalHostIP),
  701. Port: uint32(serverPort),
  702. User: &protocol.User{
  703. Account: serial.ToTypedMessage(&vmess.Account{
  704. Id: userID.String(),
  705. }),
  706. },
  707. },
  708. }),
  709. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  710. StreamSettings: &internet.StreamConfig{
  711. SecurityType: serial.GetMessageType(&tls.Config{}),
  712. SecuritySettings: []*serial.TypedMessage{
  713. serial.ToTypedMessage(&tls.Config{
  714. PinnedPeerCertSha256: [][]byte{certHash},
  715. }),
  716. },
  717. },
  718. }),
  719. },
  720. },
  721. }
  722. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  723. common.Must(err)
  724. defer CloseAllServers(servers)
  725. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  726. t.Fatal(err)
  727. }
  728. }
  729. func TestSimpleTLSConnectionPinnedWrongCert(t *testing.T) {
  730. tcpServer := tcp.Server{
  731. MsgProcessor: xor,
  732. }
  733. dest, err := tcpServer.Start()
  734. common.Must(err)
  735. defer tcpServer.Close()
  736. certificateDer, _ := cert.MustGenerate(nil)
  737. certificate := tls.ParseCertificate(certificateDer)
  738. certHash := tls.GenerateCertHash(certificateDer.Certificate)
  739. certHash[1] += 1
  740. userID := protocol.NewID(uuid.New())
  741. serverPort := tcp.PickPort()
  742. serverConfig := &core.Config{
  743. Inbound: []*core.InboundHandlerConfig{
  744. {
  745. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  746. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  747. Listen: net.NewIPOrDomain(net.LocalHostIP),
  748. StreamSettings: &internet.StreamConfig{
  749. SecurityType: serial.GetMessageType(&tls.Config{}),
  750. SecuritySettings: []*serial.TypedMessage{
  751. serial.ToTypedMessage(&tls.Config{
  752. Certificate: []*tls.Certificate{certificate},
  753. }),
  754. },
  755. },
  756. }),
  757. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  758. User: []*protocol.User{
  759. {
  760. Account: serial.ToTypedMessage(&vmess.Account{
  761. Id: userID.String(),
  762. }),
  763. },
  764. },
  765. }),
  766. },
  767. },
  768. Outbound: []*core.OutboundHandlerConfig{
  769. {
  770. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  771. },
  772. },
  773. }
  774. clientPort := tcp.PickPort()
  775. clientConfig := &core.Config{
  776. Inbound: []*core.InboundHandlerConfig{
  777. {
  778. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  779. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  780. Listen: net.NewIPOrDomain(net.LocalHostIP),
  781. }),
  782. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  783. Address: net.NewIPOrDomain(dest.Address),
  784. Port: uint32(dest.Port),
  785. Networks: []net.Network{net.Network_TCP},
  786. }),
  787. },
  788. },
  789. Outbound: []*core.OutboundHandlerConfig{
  790. {
  791. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  792. Receiver: &protocol.ServerEndpoint{
  793. Address: net.NewIPOrDomain(net.LocalHostIP),
  794. Port: uint32(serverPort),
  795. User: &protocol.User{
  796. Account: serial.ToTypedMessage(&vmess.Account{
  797. Id: userID.String(),
  798. }),
  799. },
  800. },
  801. }),
  802. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  803. StreamSettings: &internet.StreamConfig{
  804. SecurityType: serial.GetMessageType(&tls.Config{}),
  805. SecuritySettings: []*serial.TypedMessage{
  806. serial.ToTypedMessage(&tls.Config{
  807. PinnedPeerCertSha256: [][]byte{certHash},
  808. }),
  809. },
  810. },
  811. }),
  812. },
  813. },
  814. }
  815. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  816. common.Must(err)
  817. defer CloseAllServers(servers)
  818. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err == nil {
  819. t.Fatal(err)
  820. }
  821. }
  822. func TestUTLSConnectionPinned(t *testing.T) {
  823. tcpServer := tcp.Server{
  824. MsgProcessor: xor,
  825. }
  826. dest, err := tcpServer.Start()
  827. common.Must(err)
  828. defer tcpServer.Close()
  829. certificateDer, _ := cert.MustGenerate(nil)
  830. certificate := tls.ParseCertificate(certificateDer)
  831. certHash := tls.GenerateCertHash(certificateDer.Certificate)
  832. userID := protocol.NewID(uuid.New())
  833. serverPort := tcp.PickPort()
  834. serverConfig := &core.Config{
  835. Inbound: []*core.InboundHandlerConfig{
  836. {
  837. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  838. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  839. Listen: net.NewIPOrDomain(net.LocalHostIP),
  840. StreamSettings: &internet.StreamConfig{
  841. SecurityType: serial.GetMessageType(&tls.Config{}),
  842. SecuritySettings: []*serial.TypedMessage{
  843. serial.ToTypedMessage(&tls.Config{
  844. Certificate: []*tls.Certificate{certificate},
  845. }),
  846. },
  847. },
  848. }),
  849. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  850. User: []*protocol.User{
  851. {
  852. Account: serial.ToTypedMessage(&vmess.Account{
  853. Id: userID.String(),
  854. }),
  855. },
  856. },
  857. }),
  858. },
  859. },
  860. Outbound: []*core.OutboundHandlerConfig{
  861. {
  862. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  863. },
  864. },
  865. }
  866. clientPort := tcp.PickPort()
  867. clientConfig := &core.Config{
  868. Inbound: []*core.InboundHandlerConfig{
  869. {
  870. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  871. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  872. Listen: net.NewIPOrDomain(net.LocalHostIP),
  873. }),
  874. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  875. Address: net.NewIPOrDomain(dest.Address),
  876. Port: uint32(dest.Port),
  877. Networks: []net.Network{net.Network_TCP},
  878. }),
  879. },
  880. },
  881. Outbound: []*core.OutboundHandlerConfig{
  882. {
  883. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  884. Receiver: &protocol.ServerEndpoint{
  885. Address: net.NewIPOrDomain(net.LocalHostIP),
  886. Port: uint32(serverPort),
  887. User: &protocol.User{
  888. Account: serial.ToTypedMessage(&vmess.Account{
  889. Id: userID.String(),
  890. }),
  891. },
  892. },
  893. }),
  894. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  895. StreamSettings: &internet.StreamConfig{
  896. SecurityType: serial.GetMessageType(&tls.Config{}),
  897. SecuritySettings: []*serial.TypedMessage{
  898. serial.ToTypedMessage(&tls.Config{
  899. Fingerprint: "random",
  900. PinnedPeerCertSha256: [][]byte{certHash},
  901. }),
  902. },
  903. },
  904. }),
  905. },
  906. },
  907. }
  908. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  909. common.Must(err)
  910. defer CloseAllServers(servers)
  911. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err != nil {
  912. t.Fatal(err)
  913. }
  914. }
  915. func TestUTLSConnectionPinnedWrongCert(t *testing.T) {
  916. tcpServer := tcp.Server{
  917. MsgProcessor: xor,
  918. }
  919. dest, err := tcpServer.Start()
  920. common.Must(err)
  921. defer tcpServer.Close()
  922. certificateDer, _ := cert.MustGenerate(nil)
  923. certificate := tls.ParseCertificate(certificateDer)
  924. certHash := tls.GenerateCertHash(certificateDer.Certificate)
  925. certHash[1] += 1
  926. userID := protocol.NewID(uuid.New())
  927. serverPort := tcp.PickPort()
  928. serverConfig := &core.Config{
  929. Inbound: []*core.InboundHandlerConfig{
  930. {
  931. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  932. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  933. Listen: net.NewIPOrDomain(net.LocalHostIP),
  934. StreamSettings: &internet.StreamConfig{
  935. SecurityType: serial.GetMessageType(&tls.Config{}),
  936. SecuritySettings: []*serial.TypedMessage{
  937. serial.ToTypedMessage(&tls.Config{
  938. Certificate: []*tls.Certificate{certificate},
  939. }),
  940. },
  941. },
  942. }),
  943. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  944. User: []*protocol.User{
  945. {
  946. Account: serial.ToTypedMessage(&vmess.Account{
  947. Id: userID.String(),
  948. }),
  949. },
  950. },
  951. }),
  952. },
  953. },
  954. Outbound: []*core.OutboundHandlerConfig{
  955. {
  956. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  957. },
  958. },
  959. }
  960. clientPort := tcp.PickPort()
  961. clientConfig := &core.Config{
  962. Inbound: []*core.InboundHandlerConfig{
  963. {
  964. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  965. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  966. Listen: net.NewIPOrDomain(net.LocalHostIP),
  967. }),
  968. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  969. Address: net.NewIPOrDomain(dest.Address),
  970. Port: uint32(dest.Port),
  971. Networks: []net.Network{net.Network_TCP},
  972. }),
  973. },
  974. },
  975. Outbound: []*core.OutboundHandlerConfig{
  976. {
  977. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  978. Receiver: &protocol.ServerEndpoint{
  979. Address: net.NewIPOrDomain(net.LocalHostIP),
  980. Port: uint32(serverPort),
  981. User: &protocol.User{
  982. Account: serial.ToTypedMessage(&vmess.Account{
  983. Id: userID.String(),
  984. }),
  985. },
  986. },
  987. }),
  988. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  989. StreamSettings: &internet.StreamConfig{
  990. SecurityType: serial.GetMessageType(&tls.Config{}),
  991. SecuritySettings: []*serial.TypedMessage{
  992. serial.ToTypedMessage(&tls.Config{
  993. Fingerprint: "random",
  994. PinnedPeerCertSha256: [][]byte{certHash},
  995. }),
  996. },
  997. },
  998. }),
  999. },
  1000. },
  1001. }
  1002. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1003. common.Must(err)
  1004. defer CloseAllServers(servers)
  1005. if err := testTCPConn(clientPort, 1024, time.Second*20)(); err == nil {
  1006. t.Fatal(err)
  1007. }
  1008. }