亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sslclientsocket.cpp

?? 實現了數字證書的制作、SSL安全通訊、加解密操作等功能
?? CPP
字號:
// SslClientSocket.cpp : implementation file
//

#include "stdafx.h"
#include "UsbKey.h"
//#include "winsock2.h"
#include "SslClientSocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSslClientSocket

CSslClientSocket::CSslClientSocket()
{
	m_Ctx=NULL;
	m_Ssl=NULL;
	m_pList=NULL;
}

CSslClientSocket::~CSslClientSocket()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSslClientSocket, CAsyncSocket)
	//{{AFX_MSG_MAP(CSslClientSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CSslClientSocket member functions
X509 * CSslClientSocket::load_cert(BIO *cert/*輸入BIO*/, int format/*格式*/,char * pwd,/*P12密碼*/char * outMsg)
{
	ASN1_HEADER *ah=NULL;
	BUF_MEM *buf=NULL;
	X509 *x=NULL;

	if 	(format == DER)
		x=d2i_X509_bio(cert,NULL);
	else if (format == PEM)
		x=PEM_read_bio_X509(cert,NULL,NULL,NULL);//PEM_read_bio_X509_AUX
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(cert, NULL);
		PKCS12_parse(p12, pwd, NULL, &x, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for input cert\n");
		goto end;
	}
end:
	if (x == NULL)
	{
		sprintf(outMsg,"unable to load certificate\n");
	}
	if (ah != NULL) ASN1_HEADER_free(ah);
	if (buf != NULL) BUF_MEM_free(buf);
	return(x);
}

X509 * CSslClientSocket::LoadCert(char * cert,int certlen,char * outMsg)//枚舉DER/PEM格式
{
	BIO * in=NULL;
	X509 * x509=NULL;

	if(certlen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(cert, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(cert,certlen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}
	if((x509=load_cert(in,DER,NULL,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//恢復bio
		x509=load_cert(in,PEM,NULL,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return x509;
}

EVP_PKEY * CSslClientSocket::load_key(BIO *bio, int format, char *pass,char * outMsg)
{
	EVP_PKEY *pkey=NULL;

	if (format == DER)
	{
		pkey=d2i_PrivateKey_bio(bio, NULL);
	}
	else if (format == PEM)
	{
		pkey=PEM_read_bio_PrivateKey(bio,NULL,NULL,pass);
	}
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(bio, NULL);
		PKCS12_parse(p12, pass, &pkey, NULL, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for key\n");
		goto end;
	}
end:
	if (pkey == NULL)
		sprintf(outMsg,"unable to load Private Key\n");
	return(pkey);
}

EVP_PKEY * CSslClientSocket::LoadKey(char * key,int keylen,char * pass,char * outMsg)
{
	EVP_PKEY *pkey=NULL;
	BIO * in=NULL;

	if(keylen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(key, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(key,keylen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}

	if((pkey=load_key(in,DER,pass,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//BIO是可讀寫的,那么該BIO所有數據都會被清空;
						//如果該BIO是只讀的,那么該操作只會簡單將指
						//針指向原始位置,里面的數據可以再讀.
		pkey=load_key(in,PEM,pass,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return pkey;
}

int CSslClientSocket::Rand(const char *file,int dont_warn,char * outMsg)
{
	int consider_randfile = (file == NULL);
	char buffer[200];
	
#ifdef WINDOWS
//	BIO_flush(bio_e);
	RAND_screen();
#endif
	
	if (file == NULL)
		file = RAND_file_name(buffer, sizeof buffer);
	else if (RAND_egd(file) > 0)
	{
	/* we try if the given filename is an EGD socket.
		if it is, we don't write anything back to the file. */
		return 1;
	}
	if (file == NULL || !RAND_load_file(file, -1))
	{
		if (RAND_status() == 0 && !dont_warn)
		{
			sprintf(outMsg,"unable to load 'random state'\n");
			sprintf(outMsg,"This means that the random number generator has not been seeded\n");
			if (consider_randfile) /* explanation does not apply when a file is explicitly named */
			{
				sprintf(outMsg,"Consider setting the RANDFILE environment variable to point at a file that\n");
				sprintf(outMsg,"'random' data can be kept in (the file will be overwritten).\n");
			}
		}
		return 0;
	}
	return 1;
}

void CSslClientSocket::GetPeerInfo(SSL * ssl,stuSERVERINFO * stu)
{
	
	X509 *peer=NULL;
	char *p;
	static char *space="                ";
	char buf[BUFSIZ];//512
	STACK_OF(X509) *sk;
	STACK_OF(X509_NAME) *sk2;
	SSL_CIPHER *c;
	X509_NAME *xn;
	int j,i;
	BIO *bio=BIO_new(BIO_s_mem());
	char bufout[1024]={0};
	
	int got_a_chain = 0;
	
	sk=SSL_get_peer_cert_chain(ssl);//returns a pointer to STACKOF(X509) certificates
	if (sk != NULL)
	{
		got_a_chain = 1; /* we don't have it for SSL2 (yet) */
		
		for (i=0; i<sk_X509_num(sk); i++)
		{
			X509_NAME_oneline(X509_get_subject_name(sk_X509_value(sk,i)),
				stu->peerChain.sub,BUFSIZ);
			X509_NAME_oneline(X509_get_issuer_name(sk_X509_value(sk,i)),
				stu->peerChain.iss,BUFSIZ);
			//	PEM_write_bio_X509(bio,sk_X509_value(sk,i));
			//	BIO_read(bio,bufout,4*BUFSIZ);
		}
	}
	
	peer=SSL_get_peer_certificate(ssl);
	if (peer != NULL)
	{
		//	Server certificate
		PEM_write_bio_X509(bio,peer);
		BIO_read(bio,stu->Cert,4*BUFSIZ);
		BIO_flush(bio);
		X509_NAME_oneline(X509_get_subject_name(peer),
			stu->peerCert.sub,BUFSIZ);
		X509_NAME_oneline(X509_get_issuer_name(peer),
			stu->peerCert.iss,BUFSIZ);
	}
	else
		strcpy(stu->Cert,"no peer certificate available");
	
	sk2=SSL_get_client_CA_list(ssl);
	if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
	{
		//	BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
		for (i=0; i<sk_X509_NAME_num(sk2); i++)
		{
			xn=sk_X509_NAME_value(sk2,i);
			X509_NAME_oneline(xn,stu->selfChain,BUFSIZ);
			//	BIO_write(bio,buf,strlen(buf));
			//	BIO_write(bio,"\n",1);
		}
	}
	else
	{
		strcpy(stu->selfChain,"No client certificate CA names sent");
	}
	
	p=SSL_get_shared_ciphers(ssl,buf,BUFSIZ);
	if (p != NULL)
	{
	/* This works only for SSL 2.  In later protocol
	* versions, the client does not know what other
	* ciphers (in addition to the one to be used
		* in the current connection) the server supports. */
		
		//	BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
		j=i=0;
		while (*p)
		{
			if (*p == ':')
			{
				BIO_write(bio,space,15-j%25);
				i++;
				j=0;
				BIO_write(bio,((i%3)?" ":"\n"),1);
			}
			else
			{
				BIO_write(bio,p,1);
				j++;
			}
			p++;
		}
		BIO_write(bio,"\n",1);
	}
	
	//SSL handshake has read %ld bytes and written %ld bytes\n",
	stu->read=BIO_number_read(SSL_get_rbio(ssl));
	stu->written=BIO_number_written(SSL_get_wbio(ssl));
	
	//	BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
	c=SSL_get_current_cipher(ssl);
	//BIO_printf(bio,"%s, Cipher is %s\n",
	strcpy(stu->CiphersVer,SSL_CIPHER_get_version(c));
	strcpy(stu->CiphersName,SSL_CIPHER_get_name(c));
	if (peer != NULL)
	{
		EVP_PKEY *pktmp;
		pktmp = X509_get_pubkey(peer);
		//Server public key bit
		stu->CertBit=EVP_PKEY_bits(pktmp);
		EVP_PKEY_free(pktmp);
	}
	SSL_SESSION_print(bio,SSL_get_session(ssl));
	BIO_read(bio,stu->Session,4*BUFSIZ);
	/* flush, or debugging output gets mixed with http response */
	BIO_flush(bio);
	if (peer != NULL)
		X509_free(peer);
	BIO_free(bio);
}

BOOL CSslClientSocket::SockConnect(SSL_METHOD *meth,char *certfile,int certlen, char *keyfile,int keylen,
		char * cafile, char * capath,CColorListBox * plist,LPCTSTR lpszHostAddress, UINT nHostPort,char * out)
{
	EVP_PKEY *pkey=NULL;
	X509 *x509=NULL;
	CString str;
	unsigned long l=1;
	BIO * sbio=NULL;
	struct hostent *hp;
    struct sockaddr_in addr;
    int sock,i=0;

	m_pList=plist;/////////////////////

	OpenSSL_add_ssl_algorithms();

    m_Ctx=SSL_CTX_new(meth);
	if (m_Ctx == NULL)
	{
		strcpy(out,"Create ctx error");
		return FALSE;
	}
	SSL_CTX_set_options(m_Ctx,SSL_OP_ALL);
	
	pkey=LoadKey(keyfile,keylen,NULL,out);
	
	if (pkey == NULL)
	{
		sprintf(out,"unable to load CA private key\n");
		m_Ctx=NULL;
		goto err;
	}
	
    if(!(SSL_CTX_use_PrivateKey(m_Ctx,pkey)))
	{
		strcpy(out,"adds private key to ctx error");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
	x509=LoadCert(certfile,certlen,out);
	if (x509 == NULL)
	{
		sprintf(out,"unable to load CA certificate\n");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
    if(!(SSL_CTX_use_certificate(m_Ctx,x509)))
	{
		strcpy(out,"loads certificate into ctx error");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
	if (!SSL_CTX_check_private_key(m_Ctx))
	{
		strcpy(out,"Private key does not match the certificate public key");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
    /* Load the CAs we trust*/
   if(!(SSL_CTX_load_verify_locations(m_Ctx,cafile,/*capath*/NULL)))
	{
		strcpy(out,"Couldn't read CA list");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	SSL_CTX_set_verify_depth(m_Ctx,1);
    SSL_CTX_set_client_CA_list(m_Ctx,SSL_load_client_CA_file(cafile));
    m_Ssl=SSL_new(m_Ctx);
	if(m_Ssl==NULL)
	{
		strcpy(out,"Make SSL Error");
		goto err;
	}
    /* Load randomness */
	Rand(NULL,1,out);

	/*連接服務器*/

    if(!(hp=gethostbyname(lpszHostAddress)))
	{
		strcpy(out,"Couldn't resolve host");
		return FALSE;
	}
    memset(&addr,0,sizeof(addr));
    addr.sin_addr=*(struct in_addr*)hp->h_addr_list[0];
    addr.sin_family=AF_INET;
    addr.sin_port=htons(nHostPort);
	
	sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (sock == INVALID_SOCKET) 
	{
		strcpy(out,"create socket error"); 
		return FALSE;
	}
	
	i=setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
	if (i < 0)
	{
		strcpy(out,"setsockopt error"); 
		return FALSE;
	}
	
	if (connect(sock,(struct sockaddr *)&addr,sizeof(addr)) == SOCKET_ERROR)
	{
		SSlShouDown();
		strcpy(out,"connect error"); 
		return FALSE; 
	}

    /* Connect the SSL socket */
	if (BIO_socket_ioctl(sock,FIONBIO,&l) < 0)
	{
		strcpy(out,"io set error");
		shutdown(sock,2);
		closesocket(sock);
		SSlShouDown();
		return FALSE;
	}
	
    sbio=BIO_new_socket(sock,BIO_NOCLOSE);
    SSL_set_bio(m_Ssl,sbio,sbio);
	SSL_set_connect_state(m_Ssl);
	Attach(sock,FD_WRITE|FD_CLOSE);
	str.Format("%d接入服務器%s,等待握手....",m_hSocket,inet_ntoa(addr.sin_addr));
	m_pList->AddMsg(str,M_WARING);
    return TRUE;

err:
	EVP_PKEY_free(pkey);
	X509_free(x509);
	SSlShouDown();
	return FALSE;
}

int CSslClientSocket::SSlConnect(stuSERVERINFO * stu,char * out)
{
	if(m_Ssl==NULL)
	{
		strcpy(out,"SSL沒有正確初始化");
		return -1;
	}
	int err=0;
	if ((err = SSL_connect(m_Ssl)) <= 0)
	{
		if (BIO_sock_should_retry(err))
		{
			return 0;//重試
		}
		else 
		{
			strcpy(out,"SSL連接失敗");//ERR_clear_error
			return -1;
		}
	}
	GetPeerInfo(m_Ssl,stu);
	return 1;
}

void CSslClientSocket::SSlShouDown()
{
	if(m_Ctx!=NULL)
	{
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
	}
	if(m_Ssl!=NULL)
	{
		SSL_shutdown(m_Ssl);
		SSL_free(m_Ssl);
		m_Ssl=NULL;
	}
	if(m_hSocket != INVALID_SOCKET)
	{
		ShutDown(0);//receives
		Close();
	}
}

int CSslClientSocket::SSlSend(char *buf, int len)
{
	if(m_Ssl==NULL)
		return -1;
	int k=0;
	for(;;)
	{
		k = SSL_write(m_Ssl,buf,len);
		if (k <= 0)
		{
			if (BIO_sock_should_retry(k))
			{
				Sleep(100);
				continue;//重試
			}
			return k;//出錯
		}
		break;
	}
	AsyncSelect(FD_READ|FD_CLOSE);
	return k;
}

int CSslClientSocket::SSlReceive(char *buf, int len)
{
	if(m_Ssl==NULL)
		return 0;
	int k=0;
	do
	{
		for(;;)
		{
			k = SSL_read(m_Ssl,buf,len);
			if (k <=0)
			{
				if (BIO_sock_should_retry(k))
				{
					Sleep(100);
					continue;//重試
				}
				return k;//錯誤退出				
			}
			m_pList->AddMsg(buf);
			break;
		}
	}while (SSL_pending(m_Ssl));

	return k;
}

void CSslClientSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	CString serverIp,str;
	unsigned int port;
	GetPeerName(serverIp,port);//得到用戶ip,port
	str.Format("%d被服務器%s斷開",m_hSocket,serverIp);
	m_pList->AddMsg(str,M_WARING);
	SSlShouDown();
	CAsyncSocket::OnClose(nErrorCode);
}

void CSslClientSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	char buf[1024]={0};
	SSlReceive(buf,1024);
	CAsyncSocket::OnReceive(nErrorCode);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av高清在线观看| 97精品超碰一区二区三区| 国产麻豆成人精品| 在线中文字幕不卡| 精品国产三级电影在线观看| 国产精品传媒在线| 香蕉成人伊视频在线观看| 播五月开心婷婷综合| 日韩欧美中文字幕制服| 一区二区三区波多野结衣在线观看| 国产在线精品一区在线观看麻豆| 欧美日韩性生活| 最新久久zyz资源站| 国产精品主播直播| 日韩视频一区在线观看| 亚洲h动漫在线| 色视频欧美一区二区三区| 久久嫩草精品久久久久| 日韩和欧美一区二区三区| 日本精品一区二区三区四区的功能| 国产三级三级三级精品8ⅰ区| 日本不卡视频在线| 91精品午夜视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产成人av影院| 一区二区三区国产精华| 成人福利视频网站| 国产日韩欧美在线一区| 精品一区二区在线免费观看| 日韩欧美在线影院| 美女一区二区在线观看| 51午夜精品国产| 首页亚洲欧美制服丝腿| 在线不卡的av| 麻豆91在线播放免费| 欧美大白屁股肥臀xxxxxx| 日韩精品一区第一页| 欧美日本一区二区在线观看| 亚洲成av人**亚洲成av**| 欧美剧情电影在线观看完整版免费励志电影 | 91美女蜜桃在线| 综合色天天鬼久久鬼色| 色综合色狠狠天天综合色| 一区二区理论电影在线观看| 欧美日韩一区三区四区| 视频一区二区三区入口| 777亚洲妇女| 麻豆国产精品官网| 久久精品视频免费观看| av在线播放不卡| 一区二区三区在线免费| 欧美久久久久久蜜桃| 久久99精品国产| 中文字幕一区日韩精品欧美| 在线观看视频一区二区| 美女视频网站久久| 欧美激情综合在线| 91搞黄在线观看| 久久精品免费观看| 国产精品白丝在线| 欧美精品一卡二卡| 国产成人精品在线看| 亚洲图片欧美视频| 欧美成人精品高清在线播放 | 久久女同精品一区二区| 99国产精品视频免费观看| 亚洲妇女屁股眼交7| 日韩一区二区在线免费观看| 懂色中文一区二区在线播放| 亚洲精品成人天堂一二三| 日韩一区二区三区免费观看| 成a人片亚洲日本久久| 偷拍日韩校园综合在线| 国产肉丝袜一区二区| 在线观看视频一区| 粉嫩高潮美女一区二区三区| 亚洲综合丁香婷婷六月香| 欧美电影免费观看高清完整版| 99re成人在线| 黑人巨大精品欧美黑白配亚洲| 亚洲视频在线一区观看| 日韩欧美国产精品一区| 一本一本久久a久久精品综合麻豆| 日韩和欧美的一区| 亚洲综合色婷婷| 国产无人区一区二区三区| 欧美日韩一区二区三区在线| 国产乱国产乱300精品| 日韩精品亚洲专区| 亚洲最大成人综合| 国产精品免费看片| 26uuu国产电影一区二区| 欧美日韩精品系列| 色嗨嗨av一区二区三区| 国产美女av一区二区三区| 天堂一区二区在线| 一区二区三区在线免费视频| 中文字幕亚洲一区二区av在线 | 91成人免费在线视频| 成人一区二区在线观看| 久久99精品久久久久久国产越南| 一区二区三区高清在线| 中文字幕一区二区三区蜜月| 久久精品视频一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 国产精品视频免费| 精品国产乱码久久| 精品日韩在线一区| 欧美一区二区三区四区高清| 欧美日韩成人综合| 欧美日韩在线播| 欧美三区在线视频| 欧美色大人视频| 欧美无乱码久久久免费午夜一区| 99re视频精品| 一本到一区二区三区| 91蜜桃免费观看视频| 91老司机福利 在线| 99riav一区二区三区| 91在线看国产| 91天堂素人约啪| 91浏览器在线视频| 欧美在线一二三| 欧美三级电影一区| 欧美日韩高清影院| 91精品黄色片免费大全| 3751色影院一区二区三区| 91精品国产一区二区人妖| 制服丝袜亚洲精品中文字幕| 欧美一区二区三区四区五区| 久久这里都是精品| 久久九九99视频| 国产精品国产三级国产aⅴ中文| 中文字幕亚洲区| 亚洲一区在线观看视频| 日韩在线a电影| 国产伦精品一区二区三区免费迷| 国产一区二区三区黄视频 | 欧美网站大全在线观看| 欧美老女人在线| 欧美精品一区在线观看| 国产欧美一区二区精品性色 | 亚洲精品一线二线三线| 欧美韩日一区二区三区| 亚洲综合在线五月| 老司机免费视频一区二区三区| 黄网站免费久久| 成人av免费在线播放| 欧美日韩一区国产| 久久九九99视频| 亚洲成人自拍网| 国产麻豆视频一区| 欧美午夜理伦三级在线观看| 欧美精品一区视频| 亚洲精品免费播放| 精品一区免费av| 91麻豆文化传媒在线观看| 欧美日韩一区二区欧美激情| 欧美v亚洲v综合ⅴ国产v| 国产精品免费网站在线观看| 丝袜诱惑亚洲看片| 国产白丝网站精品污在线入口| 在线观看免费成人| 国产亚洲女人久久久久毛片| 亚洲电影第三页| 成人激情视频网站| 日韩女优电影在线观看| 亚洲男人天堂av| 国产精品羞羞答答xxdd| 欧美美女网站色| 国产精品久久久久四虎| 精品一区精品二区高清| 欧美日韩免费电影| 亚洲天堂成人在线观看| 狠狠狠色丁香婷婷综合激情| 欧美日韩免费观看一区二区三区| 欧美经典一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 一本久道中文字幕精品亚洲嫩| 国产三级一区二区| 国产真实乱子伦精品视频| 欧美精品自拍偷拍动漫精品| 国产精品国产成人国产三级 | 国产日韩av一区二区| 日韩电影在线看| 欧美伊人精品成人久久综合97| 欧美激情一区二区三区全黄 | 99久久国产综合精品女不卡| 久久综合九色综合欧美98| 日本中文字幕一区| 在线播放欧美女士性生活| 一二三四区精品视频| 日本精品视频一区二区| 中文字幕一区二区三区不卡在线| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产一区在线不卡| 精品99一区二区三区| 国产在线视频一区二区| 2024国产精品| 国模娜娜一区二区三区|